常量字串是右值,為什麼沒有呼叫相應的右值過載函式?

時間 2021-06-01 20:23:16

1樓:冒泡

誰告訴你字串常量不是左值啦,明明就是左值。。

字串常量的型別是const char [N],N是長度(含末尾\0),陣列嘛,const左值

2樓:

現行標準下,兩種寫法是等效的。但是VS2010發布於2023年,右值引用的語義在那之後又有發展。

VS2010支援的右值引用語義對應的是v2.0(N2844)。這個提案中禁止了右值引用繫結到左值的情況。

臨時構造的物件是右值,可以繫結到右值引用,但在這個提案中明確要求了初始化表示式(也就是本題中建構函式的引數)必須為右值

需要注意的是與一般字面量不同,字串常量是左值,因為其代表字元陣列。在N2844提案下使用左值構造的臨時物件不能繫結右值引用。如果使用一般的字面量(右值)構造臨時物件其實是可以繫結右值引用的。

struct IntVal

};int main()

3樓:

我在vs2015上測試了一下,會先呼叫std::string的建構函式構造出std::string,然後再呼叫push_back(_Ty&& val),根據Overload resolution,也應該是這樣。

所以一切的問題都應該歸罪於vs2010的bug

C語言中,字串常量為什麼只能給字元陣列初始化,而不能通過指標賦值

程佳 陣列是指標常量,常量不能賦值。字串在c語言裡不是原生資料型別,就是乙個內容非0結尾為0的位元組陣列。所以對字串的操作要使用string.h裡那些庫函式。 神念的經 想啥呢,一旦定義成了靜態陣列,首元素位址就是定死的。想改位址?門都沒有。指標賦值?那是改指向的位址,不是改指向的內容。strcpy...

Rust的字串為什麼設計的這麼難用

記憶體塊生命週期 這不難用啊,因為確實應該拷一下記憶體。首先leta hello letb world 這兩和c語言的const char 一樣的。如果你要乙個string,那麼是不是得拷貝乙份?這時to string建立了份string然後由變數c持有,變數c持有前有了string物件你才能 b。...

為什麼呼叫c str後字串會被改成了 0?

Harry Nu 原因 暮無井見鈴 已經解釋的很清楚了。稍微補充乙個小建議就是既然已經用了c 的std string,不如直接用std stoi http en.cppreference.com w cpp string basic string stol 何必再轉成c style string呢 ...