Test object(); Test object{};
为什么在删除构造函数的情况下允许写入?
当您编写
Test object();
它并不意味着您在删除构造函数的情况下创建类对象,编译器理解一个函数,这就是为什么当您尝试编写std::cout << sizeof(object)
时会出现错误:ISO C++ forbids applying sizeof to an expression of function type
。我可以理解它并没有因为向后兼容性而被弃用,但它可以在 C++11 中进行优化和修复,但尚未完成。从 C++11 开始,您可以使用
Test object3{};
语法创建对象,即使删除了构造函数,该对象也已经是有效对象,并且当您执行时std::cout << sizeof(object3)
输出为1
. 在这种情况下,这意味着运算符是无用的。在旧版本delete
中将它写在section中也是如此。private
当您想要创建函数聚合并进行封装时,可以使用这种代码风格。所以请不要写答案,例如
Why do you use class instead of namespace
,等等......
class Test {
Test() = delete;
Test(const Test&) = delete;
Test(Test&&) = delete;
Test& operator=(const Test&) = delete;
public:
template<typename T>
static void func();
private:
static std::string m_fileName;
};
int main() {
Test object(); //Compiles as function returning Test object
Test object2; //Doesn't compile because of deleted constructor
Test object3{}; //Compiles and it creates an object even though deleted constructor
Test object4({}); //Doesn't compile because of deleted constructor
return 0;
}