我有一段代码,其中有转换构造函数和转换运算符。
#include <iostream>
struct ClassFloat;
struct ClassInt{
int value;
ClassInt(int c) : value(c){std::cout << "From integer\n";};
ClassInt(ClassFloat x);
//explicit ClassInt(ClassFloat x);
};
struct ClassFloat{
float val;
explicit operator ClassInt() {std::cout << "Conversion operator called\n"; return ClassInt{999};}
//operator ClassInt() { std::cout << "Conversion operator called\n"; return ClassInt{999};}
};
ClassInt::ClassInt(ClassFloat x){
std::cout << "Conversion constructor called!\n";
value = (int)x.val;
}
int main(){
ClassFloat floatObj{3.5f};
ClassInt instance1 = floatObj; // (1)
ClassInt instance2 = (ClassInt)floatObj; // (2)
return 1;
}
- 如果两者都是非显式的。我收到一个编译器错误,说第一个表达式不明确。第二个表达式调用构造函数。
- 如果只有 operator 是显式的,则两种转换都使用构造函数。
- 如果只有构造函数是显式的,则第二个转换调用构造函数,第一个使用运算符。
- 如果两者都是显式的,我只能编译第二个表达式。它使用构造函数。
我不明白为什么在第二种情况下的第二个表达式中没有调用转换运算符。
我还期望在第四个场景(类似于第一个场景)中出现歧义错误,但选择了构造函数。
我使用带有 -pedantic 和 -std=c++17 标志的 g++ 7.4.0 进行编译。