我發現Microsoft Visual C++編譯器和gcc-4.8.1(由ideone.com提供)之間存在差異。考慮以下SSCCE:複製初始化和顯式構造函數 - 編譯器差異
struct S
{
int x;
};
class A
{
public:
int x;
A(const S& s) : x(s.x) {}
};
class B
{
int x, y;
public:
template <typename T> explicit B(const T& t) : x(t.x), y(t.y) {}
B(const A& a) : x(a.x), y(0) {}
};
int main() {
S s = {1};
B b1 = s; // Compiles OK on MSVC++;
// Fails on gcc - conversion from ‘S’ to non-scalar type ‘B’ requested
B b2(s); // Fails on both - Error: y is not a member of S in B::B<S>(const T &)
}
我明白爲什麼行B b2(s);
失敗 - 的explicit
構造相匹配,所以它試圖;但是t.y
不存在。精細。
但我不能確定是否允許B b1 = s;
MSVC++是正確的,或者拒絕gcc是否正確。 MSVC++正在從A::A(const S&)
構建一個臨時文件,並使用它通過B::B(const A&)
初始化b1
;我不知道爲什麼gcc錯誤。
哪個編譯器的權利?
(作爲一個音符後,如果刪除explicit
兩種編譯器拒絕B b1 = s;
- 大概是因爲模板構造函數現在是臨時的隱含建設公平的遊戲。)
編輯:從評論,它似乎MSVC++也拒絕在Visual Studio 2012中的B b1 = s;
行,所以共識似乎是它真的是一個錯誤。在這種情況下 - 錯誤的性質是什麼?那個錯誤信息是什麼的意思是?
VS2012也會因'B b1 = s;'失敗。我相信失敗是正確的行爲。哪個VS沒有失敗? – egur
有趣。我的版本是VS2010,所以它可能是一個固定的錯誤(當我們升級時,這可能會破壞我們的代碼)。不過,我仍然很想知道發生了什麼。 – Chowlett
@egur - 2012年的錯誤信息是什麼? – Chowlett