【发布时间】:2017-04-18 10:14:03
【问题描述】:
考虑以下程序:
#include <iostream>
struct X {
X () = default;
X (X &) { std::cout << "non-const called" << std::endl; }
X (X const &) { std::cout << "const called" << std::endl; }
int i () const { return 7; }
};
auto f () {
X x;
auto lambda = [=]() { return x.i(); };
return lambda;
}
int main()
{
auto lambda = f();
std::cout << lambda () << std::endl;
return 0;
}
使用 VC++15,我得到了输出
const called
const called
7
使用 Clang 3.9,我得到了
non-const called
7
这里哪个编译器是正确的?
【问题讨论】:
-
This 可能会引起您的兴趣。坦率地说,我不认为你的问题是重复的:)
-
值得注意的是,启用优化后,VC 还应用 RVO,导致只调用一次
X(X const&)。 -
@skypjack:你确定 lambdas 构造了一个 const 成员吗? ideone.com/RQ7OjC我觉得数据成员不一定是const,只有
operator ()是。 -
@JohnB 够公平的。我也在更正答案。很好的收获。
-
@Oktalist 还是应该打给
X(X &),对吧?
标签: c++ visual-c++ lambda clang copy-constructor