提问者:小点点

模板参数推导与结构化绑定的工作方式不同


我正式被告知(一些书或网络上)auto中的类型推导与template中的参数类型推导是相同的。

但是,下面的代码没有编译成功,因为它引发了只读引用的增量错误。 虽然模板版本将T作为类型int而不是const int&扣除。 为什么这两个案例会有不同的推演结果?

#include "bits/stdc++.h"

using namespace std;

template <typename T>
T minmax2(T n1, T n2) {
    n1++;
    return n2;
}

int main() {
    auto [a, b] = minmax(1, 2); // minmax() return const T &
    a++;                        // compile error: can not alter read-only varaible.
    const int & c = 1, & d = 2;
    minmax2(c, d);              // the same parameter type, don't raise error
}

共1个答案

匿名用户

您的注释已经说明了您的问题://minmax()return const T&

cp std::minmax首选项

绑定之后,您基本上有以下变量:const int&aconst int&b,之后您试图增加a的常量引用,这显然是不工作的。

要修复代码,您只需创建一个a的副本,如下所示:

auto [a, b] = minmax(1, 2); // minmax() return const T &
auto a_cpy = a;
++a_cpy;

相关问题