簡體   English   中英

為什么某些類型不能使用統一的初始化語法?

[英]Why some types does not work with uniform initialization syntax?

在將我的一些C ++ 98代碼更新為C ++ 11時,我注意到統一的初始化不是那么統一。 其中一些與不完整類型(例如void ,而其他一些與pod相關。 例如,對於瑣碎的可復制類型,當初始化涉及復制/移動構造函數時,統一初始化對直接初始化或復制初始化均無效。

例如

template<class T>
T foo() { return T("Hello World");}
foo<void>();
foo<std::string>();
--------
template<class T>
T foo() { return T{"Hello World"};}
foo<void>();
foo<std::string>();

在第一部分編譯時,第二部分失敗並error: compound literal of non-object type 'void'

struct pod { int x;int y;};
pod p{1,2}; //ok pod p(1,2) is error as usual
pod p2(p);

struct foo
{
    foo(foo const& rhs) : p_(rhs.p_){}
    pod p_;
};
--------
struct pod { int x;int y;};
pod p{1,2}; 
pod p2{p};

struct foo
{
    foo(foo const& rhs) : p_{rhs.p_}{}
    pod p_;
};

同樣在這里,后半部分在復制構造上失敗並error: cannot convert 'pod' to 'int' in initialization 盡管我認為,此pod類是c ++ 11中的普通類型(甚至可以是普通復制類型),但是除了原始類型之外 ,問題仍然相同

注意:

盡管以下工作有效,

struct conv
{
    operator int()const { return 1;}
};
pod p{1,2};
pod p2{conv{}};

這不是

struct conv
{
    operator pod()const { return pod{1,2};}
};
pod p{1,2};
pod p2{conv{}};

我還注意到C數組確實適用於統一初始化,但不適用於復制/移動構造函數。 但這可能是由於數組是一個沒有復制/移動構造函數或賦值的聚合。 雖然我不知道為什么在c ++ 11中不允許使用這些語法(特別是當它們是類成員時,隱式復制/移動確實可以做到這一點)。

那么,為什么我不能盲目地將所有C ++ 98初始化更改為C ++ 11樣式統一初始化(好,除了具有初始化列表的類型!)?

我正在使用GCC 4.8.1

“統一初始化”是一個非標准術語,不幸的是,在提議階段,該術語在促進初始化列表功能時使用。

不,您不能在任何地方使用它。 以我的經驗,最好將其限制為

  • 聚合(沒有構造函數; C ++ 98已允許這樣做,但C ++ 11擴展了支持)
  • 序列( initializer_list
  • 通過值表達式return調用非顯式構造函數

盲目地改變一切並且不期望語義上的改變只是爭論的論據–做某事是因為它是新的和與眾不同的,而不是因為它是適當的。

對於泛型編程,是的,很難正確地支持上述類別的情況。 將特定的投訴發布到http://isocpp.org上的留言板,也許負責該語言的人將更加努力地恢復“統一初始化”應該改善的通用順序,而不是加重:v)。

暫無
暫無

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

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