[英]C++ constructor taking an std::initializer_list of size one
下面的示例程序代碼背后的想法是說明如果初始化程序列表構造函數在給定恰好一個元素時不等同於默認復制構造函數,則可能導致Clang出現意外結果。
它還表明Clang和GCC在復制構造函數和初始化列表構造函數之間沒有實現相同的優先級,這實際上使得對於可移植代碼不可能使用這種類型的初始化列表構造函數。
// Include directive.
#include <initializer_list>
// The struct used in this case.
struct Foo
{
// Member value.
int val;
// Default constructor.
Foo() : val(0) {}
// Initializer list constructor.
Foo(std::initializer_list<Foo>) : val(2) {}
};
// Main function.
int main()
{
// Default constructed Foo object.
Foo foo_zero;
// It is not clear to me which constructor
// should be called by the following statement.
Foo foo_test = { foo_zero };
// Return exit code.
// Clang 6.0.0 returns 0 (i.e. implicit copy constructor was called for 'foo_test').
// GCC 8.2 returns 2 (i.e. initializer list constructor was called for 'foo_test').
return foo_test.val;
}
我的問題如下:
我的示例程序的返回值應該是多少(Clang和GCC似乎不同意)?
有沒有辦法讓我的示例程序的初始化列表構造函數使用與Clang和GCC一起使用的語法調用?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.