我在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 :(得分: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