簡體   English   中英

統一初始化語法差異

[英]Uniform initialization syntax difference

這樣做有什么區別

A a{ A() };

和,

A a( A{} );

避免最煩惱的解析 我什么時候應該使用特定的?

這兩種語法在大多數情況下是等價的,選擇哪一種主要是品味問題。 如果你進入統一初始化,我建議做:

A a{ A{} };

否則,可以單獨使用括號來消除歧義:

A a((A())); // This can't be parsed as a function declaration

請注意,有一種情況(我不得不說),你問題中顯示的兩種形式並不等同。 如果你的類A有一個帶有initializer_list<A>構造initializer_list<A> ,那么當使用大括號時,該構造函數將優先於復制構造函數:

#include <initializer_list>
#include <iostream>

struct A
{
    A() { }
    A(std::initializer_list<A> l) { std::cout << "init-list" << std::endl; }
    A(A const& a) { std::cout << "copy-ctor" << std::endl; }
};

int main()
{
    A a(A{}); // Prints "copy-ctor" (or nothing, if copy elision is performed)
    A b{A()}; // Prints "init-list"
}

上面的差異顯示在這個實例中

在大多數情況下,它們是等價的,但A a{ A() }; 如果存在,則更喜歡std::initializer_list構造函數,而A a( A{} ); 將更喜歡移動/復制構造函數。

當構造最終調用移動/復制構造函數時,可以省略新對象的構造,但這對於std::initializer_list構造函數是不可能的。

這兩種語法都不會被解析為函數聲明,所以兩者都避免了最令人煩惱的解析。

#include <iostream>
#include <initializer_list>
struct A {
    A() {
        std::cout << "A()\n";
    }
    A(A&&) {
        std::cout << "A(A&&)\n";
    }
    A(std::initializer_list<A>) {
        std::cout << "A(std::initializer_list<A>)\n";
    }
};
int main()
{
    {A a{ A() };} // Prints "A()\n" "A(std::initializer_list<A>)\n"
    {A a( A{} );} // Prints "A()\n" and *possibly*
                  // (depending on copy elision) "A(A&&)\n"
}

暫無
暫無

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

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