【发布时间】:2016-06-02 23:04:01
【问题描述】:
当使用 lambda 表达式时,我的编译器会显示一个错误。这是实现(其中name 是std::string&):
auto expression = [name](const Item* x) -> bool { return x->get_name() == name; };
这是错误:
items/container.cpp:20:27: error: expected expression
auto expression = [name](const Item* x) -> bool { return x->get_name() == name; };
这些是我的编译器标志:
CFLAGS=$(-std=c++11 -stdlib=libc++ -g -Wall -Werror -Wextra -I.)
到目前为止,我使用的所有其他 C++11 功能都有效。我使用的是 MacOS 10.11.3。
>> clang --version
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
>> clang++ --version
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
不幸的是,这对我没有帮助:Clang 3.1 and C++11 support status
更新:按照下面的 cmets 建议创建了一个最小示例后,它起作用了!问题一定出在我的makefile中。这重现了错误:
CC=clang++
CFLAGS=$(-stdlib=libc++ -std=c++11 -g -Wall -Werror -Wextra -I.)
all: main
main: main.o
$(CC) $(CFLAGS) -o main *.o
main.o: main.cpp
$(CC) $(CFLAGS) -c main.cpp
我的 main.cpp 文件:
#include <iostream>
#include <string>
int main() {
auto lambda = [](const std::string& str) { return str == "whatever"; };
std::string s1 = "something else";
std::string s2 = "whatever";
std::cout << "should be false: " << lambda(s1) << std::endl;
std::cout << "should be true: " << lambda(s2) << std::endl;
return 0;
}
【问题讨论】:
-
你能给出一个最小的完整例子吗?
-
我想,这种或另一种方式,该文件实际上并没有使用您的 CFLAGS 进行编译,因为如果您离开
-std=c++11,这就是您会得到的错误。您是否在该特定文件中尝试过另一个 C++11 功能?有同样的问题吗? -
是的,我的 makefile 似乎有问题!我已经更新了上面的帖子。