如何从返回显式类型 [duplicate] 的元组的函数初始化 const 原语

How to initialize a const primitive from a function returning a tuple with explicit type [duplicate]

提问人:heretoinfinity 提问时间:11/6/2023 更新时间:11/6/2023 访问量:76

问:

我有一个函数,它不像这个问题那样通过引用返回值。我想在调用函数时调用该函数并初始化变量,但这是不可能的。constconst

我尝试声明变量,但这只有在变量不是 .有没有办法在此调用后按类型初始化变量?constconst

我在这个问题的答案中尝试了这个建议,它奏效了,但令我惊讶的是,当我明确使用时它不起作用。为什么没有它就不能工作?使用后的类型不是因为这是函数返回的吗?我想使用显式类型来使其更易于阅读。autosize_tautoautosize_t

#include <tuple>
#include <cstddef>
#include <iostream>

using namespace std;

std::tuple<const size_t, const size_t> returnSize_T_Tuple() {
    const size_t i = 2;
    const size_t j = 3;

    return {i, j};
}

std::tuple<const int, const int> returnIntTuple() {
    const int i = 2;
    const int j = 3;

    return {i, j};
}

int main(){
    // const size_t s_i; // error: uninitialized ‘const s_i’ [-fpermissive]
    // std::tie(const size_t x, const size_t y) = returnSize_T_Tuple(); // error: expected primary-expression before ‘const’
    const auto [x,y] = returnSize_T_Tuple();
    const size_t [a,b] = returnSize_T_Tuple(); // error: structured binding declaration cannot have type ‘const size_t’ {aka ‘const long unsigned int’}

    cout << "x = " << x << "; " << "a = " << a;
}
C++ 常量 stdtuple

评论

1赞 UnholySheep 11/6/2023
没有它就无法工作,因为这就是功能的定义方式。结构化绑定只接受类型说明符。您需要向委员会(和/或编译器开发人员)请愿以更改此功能autoauto
0赞 UnholySheep 11/6/2023
你还需要考虑,如果你试图解压缩一个没有 2 个相同类型的对象的元组,那么你还需要为此发明更多的语法。这大概就是为什么只允许的原因auto
0赞 user12002570 11/6/2023
“为什么没有汽车就不能工作?”因为语言就是这样定义它的。请参阅 c++ - 为什么结构化绑定仅适用于 auto
0赞 heretoinfinity 11/7/2023
@UnholySheep,解包后是变量吗?size_t

答:

0赞 Péter Farkas 11/6/2023 #1

根据P0217R3结构装订的拟议措辞:

auto 类型说明符还用于引入分解声明 (8.5 [dcl.decomp])。

因此,基于此,在这种情况下,它并不是一个真正的类型说明符,它只是声明分解表达式所需的语法,同时作为“将 const 和 ref-qualifiers 粘贴到上面的东西”。auto