首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么"const [x,y]“在绑定到引用类型时的行为不像预期的那样?

为什么"const [x,y]“在绑定到引用类型时的行为不像预期的那样?
EN

Stack Overflow用户
提问于 2018-08-07 06:16:08
回答 2查看 633关注 0票数 18

下面的代码片段摘自cppref

代码语言:javascript
复制
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&

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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 T1T1intconst T2T2int&。当const修改其左侧的内容时,这将变成int& const并导致int&

注意,int& const变成int&只有在模板参数替换中才有可能,也就是说,这不会编译:

代码语言:javascript
复制
int n = 42;
int& const doesntWork = n; // Error: 'const' qualifiers cannot be applied to 'int&'

但这确实是:

代码语言:javascript
复制
template <class T> void f(const T t)
{
   ++t;
}

int n = 42;

f<int&>(n);

int& constint&的相同收缩发生在上面。

感谢@cpplearner为我指出了这里的确切段落。

票数 15
EN

Stack Overflow用户

发布于 2018-08-07 06:43:28

它将是引用本身,而不是引用的值将是const。由于引用是不可修改的,所以没有常量引用这样的东西。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51719992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档