此代码与GCC 5.X,MSVC编译良好,但GCC 6.X给出错误:
"从初始化列表转换为'a'将使用显式构造函数'a :: a()'",clang "选择的构造函数在复制初始化中是显式的".
删除explicit或更改以a c{}解决问题,但我很好奇为什么它以这种方式工作.
class a
{
public:
explicit a () {}
};
struct b
{
a c;
};
int main() {
b d{};
}
Run Code Online (Sandbox Code Playgroud) 有人可以解释我为什么,c并c1以不同的方式构建.我明白我参考了'?'创建的副本 操作员,在施工后被摧毁,但为什么在第一种情况下它表现出其他方式.我已经测试过它的优化,但即使从控制台读取条件,我也有相同的结果.提前致谢
#include <vector>
class foo {
public:
foo(const std::vector<int>& var) :var{ var } {};
const std::vector<int> & var;
};
std::vector<int> f(){
std::vector<int> x{ 1,2,3,4,5 };
return x;
};
int main(){
std::vector<int> x1{ 1,2,3,4,5 ,7 };
std::vector<int> x2{ 1,2,3,4,5 ,6 };
foo c{ true ? x2 : x1 }; //c.var has expected values
foo c1{ true ? x2 : f() }; //c.var empty
foo c2{ false ? x2 : f() }; //c.var empty
foo c3{ x2 …Run Code Online (Sandbox Code Playgroud)