为什么C ++ 11允许您将局部变量声明为thread_local?

xml*_*lmx 5 c++ standards multithreading c++11

int main()
{
    thread_local int n;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在C ++ 11中合法。

根据cppreference

thread_local仅在名称空间范围内声明的对象,在块范围内声明的对象和静态数据成员才允许使用关键字。

我只是好奇:

局部变量始终位于当前线程的堆栈上,因此它始终是线程局部的。在这种情况下thread_local int n;完全相同int n;

为什么C ++ 11允许将局部变量声明为thread_local,而不是显式禁用它以避免滥用?

Pet*_*ter 5

根据该标准,thread_local在块范围内的变量也是隐式的static。但是,并非所有static变量都是thread_local

所以

 int main()
 {
       thread_local int x;
 }
Run Code Online (Sandbox Code Playgroud)

实际上等于

 int main()
 {
       thread_local static int x;
 }
Run Code Online (Sandbox Code Playgroud)

但不同于

 int main()
 {
       int x;    //  auto implied
 }
Run Code Online (Sandbox Code Playgroud)