为什么没有发生隐式转换
Why is implicit conversion not occurring
为什么我的转换构造函数不起作用?显式转换编译正常。
struct element {};
struct element_set {
element_set(const element& e) : e(e) {};
element_set& operator+(const element& e) { return *this; }
const element &e;
};
element e1, e2;
auto es1 = element_set(e1) + e2;
auto es2 = e1 + e2;
kent:kas kent$ g++ -std=c++14 -g implicit.cc
implicit.cc:13:15: error: invalid operands to binary expression ('element' and 'element')
auto es2 = e1 + e2;
~~ ^ ~~
1 error generated.
根据@Krizz 的回答和下面@BenVoigt 的评论,我可以通过向 element_set 添加朋友来进行隐式转换:
struct element_set {
element_set(const element& e) : e(e) {};
element_set& operator+(const element& e) { return *this; }
friend element_set operator+(const element& l, const element& r);
const element &e;
};
element_set operator+(const element& l, const element& r) { return l+r; }
感谢您的快速帮助!
您使用运算符的代码等同于:
element e1, e2;
auto es1 = element_set(e1).operator+(e2);
auto es2 = e1.operator+(e2);
你现在明白为什么这不起作用了吗?
struct element
上没有方法 operator+
。因此,编译器唯一可以尝试的是形式可达的函数:
R operator+(TypeConvertibleFromElement, TypeConvertibleFromElement)
不存在这样的函数。
注意:以上仅作说明之用。讨论 C++ 语言规范和编译器如何工作需要更精确的描述。
为什么我的转换构造函数不起作用?显式转换编译正常。
struct element {};
struct element_set {
element_set(const element& e) : e(e) {};
element_set& operator+(const element& e) { return *this; }
const element &e;
};
element e1, e2;
auto es1 = element_set(e1) + e2;
auto es2 = e1 + e2;
kent:kas kent$ g++ -std=c++14 -g implicit.cc
implicit.cc:13:15: error: invalid operands to binary expression ('element' and 'element')
auto es2 = e1 + e2;
~~ ^ ~~
1 error generated.
根据@Krizz 的回答和下面@BenVoigt 的评论,我可以通过向 element_set 添加朋友来进行隐式转换:
struct element_set {
element_set(const element& e) : e(e) {};
element_set& operator+(const element& e) { return *this; }
friend element_set operator+(const element& l, const element& r);
const element &e;
};
element_set operator+(const element& l, const element& r) { return l+r; }
感谢您的快速帮助!
您使用运算符的代码等同于:
element e1, e2;
auto es1 = element_set(e1).operator+(e2);
auto es2 = e1.operator+(e2);
你现在明白为什么这不起作用了吗?
struct element
上没有方法 operator+
。因此,编译器唯一可以尝试的是形式可达的函数:
R operator+(TypeConvertibleFromElement, TypeConvertibleFromElement)
不存在这样的函数。
注意:以上仅作说明之用。讨论 C++ 语言规范和编译器如何工作需要更精确的描述。