從經驗上看,C++總是比列表初始值設定項更喜歡列表初始值設定項。我的問題是如何強制一個類型的值初始化,它也支持直接列表初始化。下面是一個最小的非工作例如:C++ 11值初始值設定項vs列表初始值設定項
#include <initializer_list>
using namespace std;
struct foo {
foo(int) {}
foo(initializer_list<char>) {}
};
struct bar {
foo f{256};
};
在這個例子中,我想f
使用構造foo(int)
而非foo(initializer_list<char>)
進行初始化。然而,GCC和Clang都拒絕了代碼,因爲256對於char來說太大了,這意味着C++規範要求選擇列表初始值設定項。明顯地註釋掉foo
的第二個構造函數修復了這個問題。定義bar
以便在字段f
上使用值初始化的最簡單方法是什麼?理想情況下,我可以避免複製初始化f
,因爲在我的實例中沒有複製構造函數。
更新
澄清:當然有可能在bar
每一個構造函數中明確初始化f
。但我的問題特別是關於成員初始化語法,因爲在具有大量構造函數的情況下,最好只在一個地方初始化某些字段,而不是全部複製代碼。
寫一個構造函數? –
只要寫'foo f(256);'。 –
我想看看爲什麼'initializer_list'是'{256}'的可行構造函數的解釋。基於編譯器行爲推斷關於規範的東西也是不安全的。有時候多個編譯器會得到相同的錯誤。 –