如何让C++编译器将Class(i)识别为带参数的无名实例构造?
解决C++中
Class(i)被误解析为变量声明的问题 在以下C++代码中,Class(i)这一行编译失败——编译器会错误地将其解析为声明一个名为i的Class类型变量(尝试调用默认构造函数),而非调用Class(const int&)构造函数创建临时无名对象。
struct Class { Class(const int &) {} }; void foo() { int i; // 可正常编译 Class(int(i)); // 编译失败 Class(i); }
MSVC给出的编译错误如下:
C2371 'i': redefinition; different basic types E0291 no default constructor exists for class "Class"
可行的解决方法
- 使用统一初始化语法(C++11及以上支持):
Class{i};,这种写法会明确被编译器识别为构造临时对象,不会和变量声明混淆。 - 添加外层括号强制解析为表达式:
((Class(i)));,额外的括号让编译器无法将其解析为声明语句。 - 显式使用类型转换:
static_cast<Class>(i);,直接要求将i转换为Class类型,触发对应构造函数创建临时对象。 - 采用拷贝初始化语法:
Class = Class(i);,这种写法也能避免被误解析为变量声明。
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

