2017-05-29 112 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