我猜不是,但我想证实一下.是否有用const Foo&&
,Foo
哪种类型?
我知道如果声明变量或参数具有T&&
某种推导类型的类型T
,那么该变量或参数通常被称为通用引用.
Scott Meyers在其最初的演讲"C++ 11中的通用参考"中引入了 通用参考这一术语.但是,我想知道普遍参考的官方/标准术语是什么.
在模板的上下文中,应用以下"引用折叠"规则:
template <typename T>
void foo(T && t)
{
//T& & -> T&
//T& && -> T&
//T&& & -> T&
//T&& && -> T&&
}
Run Code Online (Sandbox Code Playgroud)
为什么语言禁止使用const
限定符的"通用引用" ?
template <typename T>
void foo(T const && t)
Run Code Online (Sandbox Code Playgroud)
如果类型已经解决了参考(4个案例中的3个),那似乎是有意义的.
我确信这个想法与语言的其他一些设计方面不相容,但我看不出全貌.
以下给出了编译器错误:
#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;
}
Run Code Online (Sandbox Code Playgroud)
链接到Godbolt:https://godbolt.org/z/l6IQQ7
如果我使用const auto&
它可以编译-但这不会绑定到值。
auto&&
将绑定到任何东西,以便自然也可以工作。但是,const auto&&
在这种情况下不绑定背后的逻辑是什么?我知道auto&&
会保留constness-但是有没有办法使之const
明确,同时又与引用/值无关?
动机:
对于函数等内部的“正常编程工作”,可以说类似这样的东西很棒:“我不在乎它是值还是引用-但我不会在其余函数中更改它”。
给定当前语言,这应该是可能的。
相关问题: 为什么添加const会使通用引用成为右值
我正在阅读这个 stackoverflow 答案const T&&
,其中给出了不是通用(转发)参考的一个原因:
允许 const T&& 充当转发引用,将无法重载仅采用右值引用作为参数的模板函数。
我不知道这是什么意思。我想这意味着同一个函数(模板)有两个重载,其中一个重载作为参数const T&&
。我还假设这些重载之一将始终被调用,而另一个永远不会被调用。
如果我的假设是正确的,那么这两个重载函数是什么?或者如果我错了,引用的段落实际上是什么意思?
谢谢。