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

pst*_*tix -4 c++ c++11

假设我有一个琐碎的课:

class Temp {
    private:
        int vals;
    public:
        Temp():vals(0);
        Temp(int x):vals(x);
        Temp& someFunc(const Temp& t);
};
Run Code Online (Sandbox Code Playgroud)

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

return Temp null_t; // not allowed for some reason
Run Code Online (Sandbox Code Playgroud)

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

Temp null_t;
return null_t;
Run Code Online (Sandbox Code Playgroud)

为什么我不能在与同一行中调用默认构造函数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
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 8

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

return Temp();
Run Code Online (Sandbox Code Playgroud)

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

return {};
Run Code Online (Sandbox Code Playgroud)

但是,既然你想返回一个左值("返回一个引用"),那么返回一个(引用)一个临时的,没有意义返回(引用)是没有意义的null_t,因为将活得足够长,返回值将立即无效.函数调用只能引用函数返回时仍然存在的内容.

  • 我们不要忘记`someFunc`返回一个引用! (2认同)

眠りネ*_*ネロク 6

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

嗯,你实际上可以:

return Temp{};
Run Code Online (Sandbox Code Playgroud)