gpt4 book ai didi

c++ - 为什么绑定(bind)到引用类型时 "const auto [x, y]"的行为不符合预期?

转载 作者:IT老高 更新时间:2023-10-28 22:03:43 24 4
gpt4 key购买 nike

以下代码片段摘自 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& 而不是 const int&?

最佳答案

Jarod42回答了评论中的问题,让我在这里引用标准的相关部分,来自 [dcl.struct.bind]¹:

Given the type Ti designated by std​::​tuple_­element​::​type, variables are introduced with unique names ri of type “reference to Ti” initialized with the initializer ([dcl.init.ref]), where the reference is an lvalue reference if the initializer is an lvalue and an rvalue reference otherwise. Each vi is the name of an lvalue of type Ti that refers to the object bound to ri; the referenced type is Ti.

因此在 const auto [z, w] = f(); 中,你有 const T1T1int const T2 其中 T2int&。当 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& constint& 发生与上述相同的收缩。

¹ 感谢@cpplearner 将我指向此处的确切段落。

关于c++ - 为什么绑定(bind)到引用类型时 "const auto [x, y]"的行为不符合预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51719992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com