我正式被告知(一些书或网络上)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
}
您的注释已经说明了您的问题://minmax()return const T&
cp std::minmax首选项
绑定之后,您基本上有以下变量:const int&a
和const int&b
,之后您试图增加a
的常量引用,这显然是不工作的。
要修复代码,您只需创建一个a
的副本,如下所示:
auto [a, b] = minmax(1, 2); // minmax() return const T &
auto a_cpy = a;
++a_cpy;