显式运算符的隐式转换

时间:2017-05-29 12:22:18

标签: c++ std

我在gcc(版本6.3.1)中遇到了一个奇怪的行为(在我看来)是vector :: emplace_back()。它隐式地将类型转换为另一个类型,即使转换运算符声明为显式。

class A
{
public:
    explicit A(double value) :
        value{value}
    {}

    explicit operator double() const
    {
        return value;
    }

private:
    double value;
};

int main()
{
    A a{0.0};
    std::vector<double> values;
    values.emplace_back(a); // <- no error here!    

    return 0;
}

是错误还是功能?

2 个答案:

答案 0 :(得分:0)

基本上就像Jarod42在评论中写的那样,但这里有一些细节。

emplace_back method放置一个元素

  

是通过std :: allocator_traits :: construct

构造的

如果您查看construct,则可以看到它使用placement new。它本质上就像是

new((void *)p) T(val)

这是一个明确的ctor电话。

答案 1 :(得分:0)

来自ISO [class.conv.fct]:

  

转换函数可以是显式的(7.1.2),在这种情况下它是   仅被视为用户定义的直接初始化转换   (8.5)。否则,用户定义的转换不限于使用   在作业和初始化中。

double b { A { .0 } }; // fine
double d = A { .0 }; // wrong