为什么不发生隐式转换

时间:2015-05-18 18:51:56

标签: c++ c++11 implicit-conversion

为什么我的转换构造函数不起作用?显式转换编译得很好。

class TestFoo(unittest.TestCase):

    def setUp(self):
        if not SLOW_TESTS:
            self.skipTest("slow test")
        # some expensive setup

根据@Krizz的回答和@BenVoigt的评论,我可以通过向element_set添加朋友来实现隐式转换:

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.

感谢您的快速帮助!

1 个答案:

答案 0 :(得分:2)

您使用运算符的代码等同于:

element e1, e2;
auto es1 = element_set(e1).operator+(e2); 
auto es2 = e1.operator+(e2);

你能看到为什么这不起作用吗? operator+上没有方法struct element。因此,编译器唯一可以尝试的是形式可达的函数:

R operator+(TypeConvertibleFromElement, TypeConvertibleFromElement)

不存在这样的功能。

注意:以上内容仅供参考。讨论C ++语言规范以及编译器如何工作将需要更精确的描述。