如何禁用实例化临时 class?

How to disable instantiating a temporary class?

我正在使用表达式模板 class,不应对其进行实例化以避免引用悬空。但是我很想用 auto 声明一个变量,然后 'auto' 创建一个临时 class.

的命名实例

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

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

一个选择是将 Temp 的构造函数设为私有,将 testFunc 移到 Temp class 中并使其成为静态的。这样你仍然可以实例化 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;
}

Demo

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

您为防止 auto 使用所做的任何操作也会禁止该类型的其他使用。