簡體   English   中英

對成員對象的非默認顯式構造函數的內聯使用

[英]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的原始建議解決了此問題:

N2756

在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.

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