我有一個簡單的“A”類,內容如下:
class A {
public:
struct data_t {
int32_t val;
data_t(int32_t _val) :
val(_val) {
;
};
};
A& operator << (const data_t &data) {
printf("[%s] %d\n", __func__, data.val);
return *this;
};
void func(const data_t &data) {
printf("[%s] %d\n", __func__, data.val);
}
};
我嘗試了以下代碼并得到:
A a;
a<<{100}; //"expected primary-expression before ‘{’ token"
a<<A::data_t{100}; //OK.
a.func({100}); //OK.
為什么是<<{100}; 是 NG 和 a.func({100}); 好嗎?
我不想使用第二句話,因為它太長且閱讀起來很復雜。
uj5u.com熱心網友回復:
由于A::data_t有一個轉換建構式(一個非顯式的單引數建構式),編譯器可以進行從int32_tto的隱式轉換A::data_t。
這意味著你可以簡單地做例如
a << 100;
uj5u.com熱心網友回復:
為什么是<<{100}; 是 NG 和 a.func({100}); 好嗎?
該語言的語法只允許在某些地方使用花括號初始化串列。作為運算式中(算術)運算子的運算元,它通常是不允許的,即使認為人們可能能夠對多載的運算子理解它。
可能允許帶括號的初始化器串列:
- 在變數、類成員、
new運算式、默認引數的初始化器中(用于函式引數和非型別模板引數) - 在型別說明符之后(功能型別轉換表示法)
- 作為函式呼叫和模板引數中的引數
- 作為賦值的右側
- 作為 和 的操作
return數co_returnco_yield - 作為范圍內的初始化程式-
for
假設我沒有忘記任何情況,它們不能在其他任何地方使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421519.html
標籤:
