有条件的? :具有类构造函数的运算符

时间:2018-11-23 14:30:27

标签: c++ c++14 conditional-operator

有人可以向我解释为什么cc1的构造方式不同。 我了解我已经引用了由“?”创建的副本运算符,它在构造后被销毁,但是为什么在第一种情况下它会以其他方式运行。 我已经测试了它的优化,但是即使从控制台读取了条件,我也会得到相同的结果。预先感谢

#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
}

1 个答案:

答案 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的任何访问都是未定义的行为

live example on godbolt.org