小编Ale*_*hev的帖子

可以在头文件中使用lambda违反ODR吗?

可以在头文件中写入以下内容:

inline void f () { std::function<void ()> func = [] {}; }
Run Code Online (Sandbox Code Playgroud)

要么

class C { std::function<void ()> func = [] {}; C () {} };
Run Code Online (Sandbox Code Playgroud)

我想在每个源文件中,lambda的类型可能不同,因此包含的类型std::function(target_type的结果会有所不同).

这是一个ODR(一个定义规则)违规,尽管看起来像一个共同的模式和合理的事情?第二个示例是每次都违反ODR还是仅在头文件中至少有一个构造函数?

c++ lambda one-definition-rule language-lawyer c++11

68
推荐指数
2
解决办法
4182
查看次数

在括号内的lambda内声明名为`this`的变量会导致3个不同的编译器产生不同的结果

在C++中,可以在括号内声明变量,例如int (x) = 0;.但似乎如果你使用this而不是变量名,那么使用构造函数:A (this);调用A::A(B*).所以第一个问题是为什么它不同this,是因为变量无法命名this?让事情变得复杂有点让我们放入this一个lambda -

struct B;
struct A
{
  A (B *) {}
};

struct B 
{
  B ()
  {
    [this] { A (this); } ();
  }
};
Run Code Online (Sandbox Code Playgroud)

现在gcc调用A::A(B*),msvc打印有关缺少默认构造函数和clang打印的错误expected expression(https://godbolt.org/g/Vxe0fF).它甚至在msvc中更有趣 - 它确实创建了this可以使用的名称变量,因此它绝对是一个错误(https://godbolt.org/g/iQaaPH).哪种编译器是正确的,这种行为的原因是什么?

c++ language-lawyer c++11

6
推荐指数
1
解决办法
167
查看次数