在return语句中调用默认构造函数

时间:2018-01-27 20:13:08

标签: c++ c++11

假设我有一个琐碎的课程:

class Temp {
    private:
        int vals;
    public:
        Temp():vals(0);
        Temp(int x):vals(x);
        Temp& someFunc(const Temp& t);
};

并说someFunc有一个条件,它会调用以下内容:

return Temp null_t; // not allowed for some reason

然而,这有效(正如预期的那样):

Temp null_t;
return null_t;

为什么我不能在与return相同的行中调用默认构造函数?

编辑(someFunc实施):

Temp& Temp::someFunc(const Temp& rhs) {
    if (this->vals == rhs.vals) {
        // return a reference to an empty Temp object
        *this = Temp(); // dereference, copy-assignment
        return *this;
    this->vals = rhs.vals
    return *this
}

2 个答案:

答案 0 :(得分:8)

如果你的函数是按值返回的(即Temp someFunc(const Temp&),那么你可以只使用一个实际的临时变量,而不是一个命名变量(这不是暂时的):

return Temp();

如果返回类型不是具有显式默认构造函数的类类型,您还可以说:

return {};

但是,既然你想要返回一个左值(“返回一个引用”),那么返回(引用)一个临时值也没有意义,返回(引用)你的意义也没有意义null_t,因为两者都不会活得足够长,返回值会立即失效。函数调用只能引用函数返回时仍然存在的东西。

答案 1 :(得分:6)

  

为什么我不能在返回的同一行中调用默认构造函数?

嗯,你其实可以:

return Temp{};