[英]Inline use of non-default explicit constructor for a member object
在C ++ 11(或以后的版本)中,以下合法的代碼有一些簡單的變化嗎?
class A
{
public:
std::vector<char> b(123); // declare a vector with 123 elements
};
我能找到的最接近的東西有點笨拙,可能效率低下...
class A
{
public:
std::vector<char> b = std::vector<char>(123);
};
我試圖避免使用初始化列表。 我更喜歡將b
的聲明和初始化整合到一行代碼中。 向量將始終是相同的大小。
在此示例中,我使用的是std::vector
,但是答案可能會更普遍。
為了達到良好的效果,這是gcc
4.8版的錯誤消息:
錯誤:數值常量std :: vector b(123)之前的預期標識符;
這是clang
3.7版的消息:
錯誤:預期參數聲明程序std :: vector b(123);
不大可能。 首先允許NSDMI的原始建議解決了此問題:
在Kona中提出的有關標識符范圍的問題:
在核心工作組在2007年9月於科納舉行的會議上進行討論時,引發了一個關於初始化程序中標識符范圍的問題。 我們是否要允許類范圍具有正向查找的可能性? 還是我們需要在解析初始點時就對其進行定義?
需要什么:
類范圍查找的動機是,我們希望能夠將任何內容放入非靜態數據成員的初始化程序中,而我們可以將其放入mem初始化程序中,而無需顯着改變語義(模直接初始化與復制初始化) :
int x(); struct S { int i; S() : i(x()) {} // currently well-formed, uses S::x() // ... static int x(); }; struct T { int i = x(); // should use T::x(), ::x() would be a surprise // ... static int x(); };
問題一:
不幸的是,這使得在解析聲明時“ ( expression-list ) ”形式的初始化程序變得模棱兩可:
...
提案:
CWG在科納(Kona)進行了6比3的秸稈調查,以支持類范圍查找; 這就是本文所建議的,將非靜態數據成員的初始化程序限制為“ = initializer-clause ”和“ { initializer-list } ”形式。 我們相信:
問題1 :因為我們沒有提出()表示法,所以不會發生此問題。 =和{}初始化程序表示法不會遇到此問題。
除非您的編譯器未采用復制省略(所有主要方法都采用了復制省略),否則笨拙的初始化方式不會有任何效率低下的情況。 問題在於C ++的語言設計師已經將自己擺在一個角落。 因為初始值設定項列表構造函數是貪婪的 ,所以花括號初始化將使用給定的元素構造一個向量,而使用括號的舊語法會調用顯式構造函數來設置大小。
除非您不能在NSDMI中使用該構造函數。 除非使用等號。
如果由於某種原因打擾您,則有一些笨拙的解決方法:
std::vector<char> c = decltype(c)(123);
// ...
using VChar = std::vector<char>;
VChar v = VChar(123);
或認識到新功能並不排除現有功能:
std::vector<char> c;
A() : c(123)
{
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.