使用初始化列表作为构造函数参数时重载函数调用歧义问题咨询
使用初始化列表作为构造函数参数时重载函数调用歧义问题咨询
大家好,我最近写C++代码时碰到了一个编译报错的问题,想请教下各位:当一个类同时定义了显式单参数构造函数和拷贝/移动构造函数时,要是用初始化列表的形式传递构造参数,编译器就会抛出调用歧义的错误。
具体的错误提示是这样的:
error: call of overloaded 'Base(
)' is ambiguous
更详细的错误日志和对应的示例代码如下:
<source>: In function 'int main()': <source>:33:23: error: call of overloaded 'Base(<brace-enclosed initializer list>)' is ambiguous 33 | Base obj{1}; | ^ <source>:10:5: note: candidate: 'Base::Base(int)' 10 | explicit Base(int val) : value(val) {} | ^~~~ <source>:14:5: note: candidate: 'Base::Base(const Base&)' 14 | Base(const Base& other) = default; | ^~~~ <source>:15:5: note: candidate: 'Base::Base(Base&&)' 15 | Base(Base&& other) = default; | ^~~~
就像上面的例子,我定义了Base类,有一个显式接收int参数的构造函数,还有默认生成的拷贝、移动构造函数,当用Base obj{1};这种方式初始化对象时,编译器就分不清该调用哪个构造函数了,有没有大佬能帮忙解释下歧义产生的原因,以及对应的解决办法呀?
内容来源于stack exchange




