簡體   English   中英

const 轉發參考給出錯誤 C2440:'initializing': cannot convert from 'const std::string' to 'const std::string &&'

[英]const forwarding reference gives error C2440: 'initializing': cannot convert from 'const std::string' to 'const std::string &&'

以下給出了編譯器錯誤:

  #include <string>

  const std::string& get_name();

  int main(){
    auto&& name1 = get_name();//should bind to whatever
    const auto& name2 = get_name();//also ok
    const auto&& name3 = get_name();//<-not ok, why ?
    return 0;
  }

神螺栓鏈接: https://godbolt.org/z/l6IQQ7

如果我使用const auto&它會編譯 - 但這不會綁定到值。 auto&&將綁定到任何東西,這樣自然也能正常工作。 但是,在這種情況下const auto&&不綁定背后的邏輯是什么? 我知道auto&&會保留 constness - 但是有沒有辦法使const顯式並且同時與引用/值無關

動機:

對於函數內部的“正常編程工作”等,如果能夠說出類似的話會很棒: “我不在乎它是一個值還是一個參考 - 但我不會為函數的 rest 更改它”

考慮到當前的語言,這應該是可能的。

相關問題: 為什么添加`const`會使通用引用成為右值

對於函數內部的“正常編程工作”等,如果能夠說如下的話會很棒:“我不在乎它是一個值還是一個參考 - 但我不會為函數的 rest 更改它”。

您已經有了激勵您的解決方案:使用const auto& const auto&將綁定到:

  • const 左值引用
  • 左值參考
  • const rvalue 引用
  • 右值參考
  • 此外,它將延長返回值的生命周期

所以你得到了你需要的一切。 是的,它與 const rvalue ref 不同,但如果你只使用它,那並不重要,因為無論如何你都無法從中移動,因為它是 const。

最后一點: auto&&將永遠是一個參考。 它是一個帶有扣除的轉發引用,但您的最終變量將始終是一個引用(右值引用或左值引用,但絕不是“值”)。 也許那是/是一個誤解?

暫無
暫無

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

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