2017-05-29 99 views
1

我在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; 
} 

它是一个错误或功能?

+0

'emplace_back'从给定参数显式构建。 – Jarod42

+0

虽然你会得到'push_back'的错误。 – Jarod42

回答

1

它基本上是Jarod42在评论中写的,但这里有一些细节。

emplace_back method emplaces这

通过的std :: allocator_traits构成元素::构建

如果你看一下construct,你可以看到它使用placement new。它本质上类似于

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

这是一个明确的ctor调用。

0

从ISO [class.conv.fct]:

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

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