在我以这种方式声明变量之后:
#include <thread>
namespace thread_space
{
thread_local int s;
} //etc.
Run Code Online (Sandbox Code Playgroud)
我试图使用'g ++ -std = c ++ 0x -pthread [sourcefile]'编译我的代码.我收到以下错误:
example.C:6:8: error: thread-local storage is unsupported for the current target
static thread_local int s;
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用GCC 4.8.1在Linux上使用相同的标志编译相同的代码,我会得到一个正常运行的可执行文件.我在运行OSX 10.9.3的MacBook Pro上使用了clang-503.0.40(Xcode 5.1.1附带的那个).谁能解释一下我做错了什么?谢谢!!
c ++的lambda表达式的一个特定属性是捕获声明它们的作用域中的变量.例如,我可以在lambda函数中使用声明和初始化的变量c,即使'c'没有作为参数发送,但是它被'[]'捕获:
#include<iostream>
int main ()
{int c=5; [c](int d){std::cout<<c+d<<'\n';}(5);}
Run Code Online (Sandbox Code Playgroud)
因此预期输出为10.当至少有两个变量(一个被捕获而另一个作为参数发送)具有相同的名称时,就会出现问题:
#include<iostream>
int main ()
{int c=5; [c](int c){std::cout<<c<<'\n';}(3);}
Run Code Online (Sandbox Code Playgroud)
我认为2011年的c ++标准表明,在名称重合的情况下,捕获的变量优先于lambda表达式的参数.事实上,在Linux上使用GCC 4.8.1编译代码,我得到的输出是预期的,5.如果我使用apple的clang编译器编译相同的代码(clang-503.0.40,Mac OS X 10.9.4上的Xcode 5.1.1附带的那个),我得到另一个答案,3.
我想弄清楚为什么会这样; 它只是一个苹果的编译器错误(如果该语言的标准真的说捕获的'c'具有优先权)或类似的东西?这个问题可以修复吗?
编辑
我的老师给GCC服务台发了一封电子邮件,他们回答说这显然是GCC编译器的错误,并将其报告给Bugzilla.所以Clang的行为是正确的!