c++ - 引用折叠和 const

标签 c++ c++14 type-deduction

<分区>

考虑这个程序:

template<typename T>
struct Foo
{
    void foo(const T&) {}   
    void foo(T&) {}
};


int main()
{
    Foo<double&> f;   
    double d = 3.14;
    f.foo(d);   //complains that foo() is ambigous
}

在上面,如果 Foo 被实例化为 Foo<double> , 那么一切都很好,但是如果它被实例化为 Foo<double&> , 然后调用 foo变得模棱两可。在推导 foo 的参数类型时,这里的 ref 是否正在崩溃?如果是这样,为什么常量被忽略了?

最佳答案

让我们看看如果我们尝试实例化 Foo 类模板会发生什么:

template<typename T>
struct Foo {
  void foo(T const&) {}   
  void foo(T&) {}
};

带有模板参数double&。将 T 替换为 double& 并根据引用折叠规则,您将得到:

struct Foo {
  void foo(double& const) {}   
  void foo(double&) {}
};

由于引用本质上是常量 double& const 等同于 double&。因此,您将获得以下实例:

struct Foo {
  void foo(double&) {}   
  void foo(double&) {}
};

编译器大喊“伙计,你不能用相同的签名重载 foo”。

CLANG给出了一个更简洁的错误:

error: multiple overloads of 'foo' instantiate to the same signature 'void (double &&)' void foo(T&) { }

Live Demo

关于c++ - 引用折叠和 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44911479/

相关文章:

c++ - 作为右值 (c++) 在函数中传递的左值会发生什么?

c++ - 排序谓词不传递对索引对象的引用?

c++ - f() 按值返回对象的 "auto&& a= f();"中 a 的生命周期是多少?

c++ - 从模板成员类型派生模板化类的成员变量类型

c++ - OMP 目标中对全局数组(malloc 与静态)的不同处理

c++ - 将 volatile 用于 WinAPI 线程之间的共享变量

c++ - 简单的用户输入验证不起作用

c++ - 如何强制编译器在编译时评估开关?

c++ - 三字母仍然有效 C++ 吗?

c++ - 将模板与类模板推导占位符参数匹配