c++ - 为什么 `const T&` 不确定是 const?

标签 c++ templates constants function-templates const-reference

template<typename T>
void f(T a, const T& b)
{
    ++a; // ok
    ++b; // also ok!
}

template<typename T>
void g(T n)
{
    f<T>(n, n);
}

int main()
{
    int n{};
    g<int&>(n);
}

请注意:bconst T&++b 没问题!

为什么 const T& 不一定是 const?

最佳答案

欢迎使用 const 和 reference collapsing .当您有 const T& 时,引用将应用于 Tconst 也是如此。你调用 g 喜欢

g<int&>(n);

所以你已经指定 T 是一个 int&。当我们将一个引用应用到一个左值引用时,两个引用合并为一个,所以 int& & 变成了 int&。然后我们从 [dcl.ref]/1 得到规则。 ,它指出如果您将 const 应用于引用,它将被丢弃,因此 int& const 只是变成 int& (请注意,您实际上不能声明 int& const,它必须来自 typedef 或模板)。这意味着

g<int&>(n);

你真的在打电话

void f(int& a, int& b)

而且你实际上并没有修改常量。


你是否将 g 称为

g<int>(n);
// or just
g(n);

那么 T 将是 int,而 f 将被标记为

void f(int a, const int& b)

由于 T 不再是一个引用,const& 被应用到它,你会收到一个编译器尝试修改常量变量时​​出错。

关于c++ - 为什么 `const T&` 不确定是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54480599/

相关文章:

c++ - 动画弹出显示

c++ - cppitertools:如何结合 iter::enumerate 和 iter::filter?

c++ - 仅使用 bool 和 char 定义模板类

c++ - 放置新的中断常量和引用?

c++ - 不断结合优化编译器

c++ - boost group_threads 最大并行线程数

c++ - 关于strcmp的问题

C 编程模板数据类型

C++ 模板和字符串文字

objective-c - 为什么我不能在 Objective-C 的 switch-case 语句中使用我的常量? [错误 = 表达式不是整型常量表达式]