【发布时间】:2015-11-12 21:16:19
【问题描述】:
问题:传递一个通用 lambda(到模板函数) 捕获 this 并在没有显式 this-> 的情况下调用 this 的成员函数不在 gcc 上编译。如果 lambda 不是通用的,或者如果 lambda 没有传递给任何其他函数而是就地调用,则它会在没有显式 this-> 的情况下进行编译。在所有情况下,Clang 的代码都很酷。
又是一轮clang vs gcc的时间了。谁是对的?
template<typename TF>
void call(TF&& f)
{
f(1);
}
struct Example
{
void foo(int){ }
void bar()
{
call([this](auto x){ foo(x); });
}
};
int main()
{
Example{}.bar();
return 0;
}
- 与
bar()=call([this](auto x){ foo(x); });- clang++ 3.6+ 编译。
- g++ 5.2+ 无法编译。
错误:不能在没有对象的情况下调用成员函数 'void Example::foo(int)' 调用([this](auto x){ foo(x); });`
- 与
bar()=call([this](auto x){ this->foo(x); });- clang++ 3.6+ 编译。
- g++ 5.2+ 编译。
- 与
bar()=call([this](int x){ foo(x); });- clang++ 3.6+ 编译。
- g++ 5.2+ 编译。
- 与
bar()=[this](auto x){ foo(x); }(1);- clang++ 3.6+ 编译。
- g++ 5.2+ 编译。
为什么this-> 仅在通用 lambda 的情况下是必需的?
如果没有将 lambda 传递给 call,为什么不需要 this->?
谁不符合标准?
【问题讨论】:
-
你注意到的不一致表明clang在这里是正确的。
-
甚至不用看标准,我可以绝对肯定地说 Clang 是对的。即使不符合标准,也还是对的;在那种情况下,标准是错误的。 GCC 的行为完全没有任何意义。
-
报告了错误67274。
-
MSVC Community 2015 RC V14.0.22823.1 也将编译所有案例
标签: c++ lambda this language-lawyer c++14