簡體   English   中英

C ++構造函數采用大小為1的std :: initializer_list

[英]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;
}

我的問題如下:

  1. 我的示例程序的返回值應該是多少(Clang和GCC似乎不同意)?

  2. 有沒有辦法讓我的示例程序的初始化列表構造函數使用與Clang和GCC一起使用的語法調用?

鐺實施DR 1467 (括號初始化一個T從一個T的行為,如果你沒有使用大括號),但仍未實施DR 2137 (第二個想法,這樣做只為聚集)。

你的代碼應該返回2。

一個可能的解決方法是Foo foo_test({ foo_zero });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM