簡體   English   中英

將{}分配給已經存在的對象是什么意思?

[英]What does it mean when I assign {} to an already exsiting object?

#include <vector>
#include <queue>
using namespace std;
int main()
{
    vector<priority_queue<int>> vec;
    vec.push_back({});//compiles
    vec.push_back({1});//don't work 
    vec[0] = {};//compiles
    vec[0] = {1};//don't work 
    return 0;
}

priority_queue沒有初始化列表構造函數。

但是我仍然可以為其分配一個{}。

我認為這意味着我只是使用默認構造函數構造了一個空的priority_queue,並將其分配給已經存在的priority_queue對象。

但是那不應該是這樣嗎?

vec[0] = priority_queue<int>{};//compiles
vec[0] = priority_queue<int>();//compiles

這實際上是什么意思?為什么起作用? 我只是省略了priority_queue部分。

vec[0] = {};//compiles
vec[0] = ();//don't work 

那不是說我可以隨時重新初始化我的隊列對象嗎?

priority_queue<int> que{};
que = {};//compiles
que{};//don't work

{}在這里像nullptr嗎?

{}是所有對象的空對象,例如nullptr是每種指針的空指針嗎?

priority_queue<int>* p{};
p = nullptr;
p = {};// still works

在C ++ 11中,對賦值運算符(包括復合賦值)進行了特殊處理,因為它包含在允許進行列表初始化的上下文列表中。 由於這種特殊處理,因此在賦值運算符的右側可以使用普通的{ ... }初始化程序,如您的

vec[0] = {};

並且,根據賦值運算符的規范,它被解釋為

vec[0].operator =({});

在這種情況下, {}用作函數調用中參數的初始化程序。 由於要初始化的對象不是集合,因此{}的內容將解釋為常規構造函數的參數列表。 由於列表為空,因此將導致選擇默認構造函數。

這種特殊待遇不會擴展到其他運營商

struct S
{
  S(int, int, int) {}
  S &operator +=(const S& rhs) { return *this; }
  S operator +(const S& rhs) const { return *this; }
};

int main()
{
  S s(1, 2, 3);
  s = { 4, 5, 6 };  // OK - special treatment for `=`
  s += { 4, 5, 6 }; // OK - special treatment for `+=`
  s + { 4, 5, 6 };  // Error - no special treatment for `+`
  s + S{ 4, 5, 6 }; // OK, constructing the object explicitly works
}

大括號( {} )通常用於對象的初始化,而不僅僅是初始化程序列表。 因此,沒有初始化程序列表的類仍可以使用花括號來初始化對象,例如

class A { 
    public: 
    A(int i);
}

A a{5}; // Invokes A's constructor

它也可以用於集合初始化 (一個結構數據成員的初始化如)。在你的情況下,調用默認的構造器priority_queue

暫無
暫無

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

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