有人可以向我解释为什么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 }; //c.var has expected values
}
答案 0 :(得分:21)
条件表达式的类型是两个分支的 common类型,其 value类别也取决于它们。
对于true ? x2 : x1
,常见类型为std::vector<int>
,值类别为左值。可以使用以下方法进行测试:
static_assert(std::is_same_v<decltype((true ? x2 : x1)), std::vector<int>&>);
对于true ? x2 : f()
,常见类型为std::vector<int>
,值类别为 prvalue 。可以使用以下方法进行测试:
static_assert(std::is_same_v<decltype((true ? x2 : f())), std::vector<int>>);
因此,您将悬挂的参考存储在c1
中。对c1.var
的任何访问都是未定义的行为。