2

Test object(); Test object{};为什么在删除构造函数的情况下允许写入?

  1. 当您编写Test object();它并不意味着您在删除构造函数的情况下创建类对象,编译器理解一个函数,这就是为什么当您尝试编写std::cout << sizeof(object)时会出现错误:ISO C++ forbids applying sizeof to an expression of function type。我可以理解它并没有因为向后兼容性而被弃用,但它可以在 C++11 中进行优化和修复,但尚未完成。

  2. 从 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;
}
4

0 回答 0