下面的代码片段摘自cppref
std::tuple<int, int&> f();
auto [x, y] = f();
// decltype(x) is int
// decltype(y) is int&
const auto [z, w] = f();
// decltype(z) is const int
// decltype(w) is int&我的问题在最后一行:
为什么是 decltype(w) int& 而不是int&
发布于 2018-08-07 06:44:44
Jarod42回答了评论中的问题,让我在这里引用dcl.struct.bind¹标准的相关部分:
给定由std::tuple_element::type指定的Ti类型,引入变量的类型ri为“引用Ti”,该类型为“引用Ti”,初始化器(dcl.init.ref)初始化,其中如果初始化器为lvalue,则引用为lvalue引用,否则为rvalue引用。每个vi都是Ti类型的lvalue的名称,该值引用到与ri绑定的对象;引用的类型是Ti。
因此,在const auto [z, w] = f();中,const T1与T1为int,const T2与T2为int&。当const修改其左侧的内容时,这将变成int& const并导致int&。
注意,int& const变成int&只有在模板参数替换中才有可能,也就是说,这不会编译:
int n = 42;
int& const doesntWork = n; // Error: 'const' qualifiers cannot be applied to 'int&'但这确实是:
template <class T> void f(const T t)
{
++t;
}
int n = 42;
f<int&>(n);从int& const到int&的相同收缩发生在上面。
感谢@cpplearner为我指出了这里的确切段落。
发布于 2018-08-07 06:43:28
它将是引用本身,而不是引用的值将是const。由于引用是不可修改的,所以没有常量引用这样的东西。
https://stackoverflow.com/questions/51719992
复制相似问题