[英]what happens when assign a derived class object to a base class object(I mean object assginment, not pointer)
[英]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.