4

我正在使用不应实例化以避免悬空引用的表达式模板类。但是我很想用 auto 声明一个变量,然后“auto”创建一个临时类的命名实例。

如何在以下代码中禁用临时类的自动声明?

class Base
{
};

class Temp : public Base
{
public:
    Temp()         {}
    Temp(int, int) {}
    Temp(const Temp&) = default;
    Temp(Temp&&)      = default;
};

Temp testFunc(int a, int b) {
    return Temp{a,b};
}

int main() {
    Base a = testFunc(1,2); // this should work
    auto b = testFunc(1,2); // this should fail to compile
    return 0;
}
4

2 回答 2

1

您似乎想阻止用户auto在特定类型上使用。这在任何版本的 C++ 中都是不可能的。如果用户编写 是合法的 C++ T t = <expr>;,其中T的类型是<expr>,那么用户编写auto t = <expr>;(忽略类数据成员)也是合法的。就像您不能禁止某人<expr>使用模板参数推导传递给模板函数一样。

您为防止auto使用所做的任何事情也会抑制该类型的其他一些使用。

于 2018-08-07T04:50:43.983 回答
0

一种选择是将Temp' 的构造函数设为私有,在类testFunc内部移动Temp并使其成为静态。这样您仍然可以实例化Base,但auto会失败,因为您将调用私有构造函数:

class Base
{
};

class Temp : public Base
{
    Temp()         {}
    Temp(int, int) {}
    Temp(const Temp&) = default;
    Temp(Temp&&)      = default;

public:

    static Temp testFunc(int a, int b)
    {
        return Temp{a,b};
    }
};

int main() {
    Base a = Temp::testFunc(1,2); // this should work
    auto b = Temp::testFunc(1,2); // this should fail to compile
    return 0;
}

演示

于 2018-08-07T03:32:17.783 回答