如何禁止不赋值给变量就调用构造函数的行为?
禁止无变量绑定的构造函数调用方法
要禁止直接调用构造函数创建临时对象(如Object("param");),同时允许将对象赋值给变量(如Object obj("param");),可以采用以下几种方案:
方案一:使用[[nodiscard]]类属性(C++17及以上)
将类标记为[[nodiscard]],编译器会对丢弃该类临时对象的操作发出警告。若配合编译选项(如-Werror)将警告升级为错误,即可强制禁止此类写法。
示例代码:
#include <string> [[nodiscard]] class Object { public: explicit Object(const std::string& param) { // 构造逻辑 } }; // 允许的写法 Object obj("param"); // 禁止的写法(编译警告/错误) // Object("param");
方案二:私有构造函数+静态工厂方法
将构造函数设为私有,通过公共静态成员函数创建对象。这种方式直接从语法层面禁止了直接调用构造函数创建临时对象的可能,必须通过工厂方法获取对象并绑定到变量。
示例代码:
#include <string> class Object { private: Object(const std::string& param) { // 构造逻辑 } public: static Object create(const std::string& param) { return Object(param); } }; // 允许的写法 Object obj = Object::create("param"); // 禁止的写法(编译错误,构造函数私有) // Object("param");
方案三:删除构造函数的右值重载(C++11及以上)
通过删除构造函数的右值引用版本,阻止临时对象的创建。不过这种方式仅针对传入右值参数的场景,若传入左值参数仍可能被绕过,适用性较前两种方案窄。
示例代码:
#include <string> class Object { public: Object(const std::string& param) { // 构造逻辑 } // 删除右值版本的构造函数,禁止临时对象创建 Object(std::string&&) = delete; }; // 允许的写法 std::string str = "param"; Object obj(str); // 禁止的写法(编译错误,右值构造被删除) // Object("param");
内容的提问来源于stack exchange,提问作者sberfiacreix
相关产品推荐
相关产品推荐

