c 14 – 如何禁用实例化临时类?

我正在使用一个表达式模板类,它不应该被实例化以避免悬空引用.但我很想用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;
}

最佳答案 您似乎想要阻止用户在特定类型上使用auto.这在任何版本的C中都是不可能的.如果用户写入T t =< expr>;是合法的C,其中T是< expr>的类型,那么用户写入auto t =< expr>; (忽略类数据成员).就像你不能禁止有人传递< expr>使用模板参数推导的模板函数.

您为防止自动使用而做的任何事情也会抑制该类型的其他一些用法.

点赞