【问题标题】:Question about C++0x reference collapse关于C++0x引用崩溃的问题
【发布时间】:2010-12-13 01:28:28
【问题描述】:

我不知道为什么这些代码无法编译。我已经在 Visual c++ 2010 和 gcc 中使用 -std=c++0x 进行了测试。有人给点建议吗? 谢谢!

template<typename T>
class Foo
{
public:
 void test(const T&){cout<<"const";}
 void test(      T&){cout<<"non const";}
};

int main()
{
 int a;
 Foo<int&> f;
}

编译错误:'void Foo::test(T)':成员函数已定义或声明

但是为什么可以编译呢?

template<typename T> void foo(const T&){cout<<"const"; }
template<typename T> void foo( T&){cout<<"non const"; }
int main()
 {
    int a; 
    foo<int&>(a);
 }

我看过 c++0x 的文章说:T& & ==T& ,所以 const T& & == const T& ?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    我看过 c++0x 的文章说:T& & ==T& ,所以 const T& & == const T& ?

    实际上,这没有多大意义。恕我直言,最好将其放入表格中:

    T       T&      const T      const T&
    ---------------------------------------
    int     int&    const int    const int&
    int&    int&    int&         int&
            (1)     (2)          (1+2)
    
    1: Reference collapsing in action
    2: const applies to the reference and is therefore ignored
    

    如果 T 已经是一个引用(第 2 行),const T 中的 const 适用于 reference 而不是裁判。但是一个引用本质上是恒定的,因为你不能在初始化后让它引用另一个对象,所以这里 const 只是被忽略了。您可以将其视为“常量崩溃”。 ;-)

    【讨论】:

      【解决方案2】:

      这个:

      Foo<int&> f;
      

      产生这个实例化:

      class Foo<int&>
      {
      public:
       void test(int&);
       void test(int&);
      };
      

      const 应用于作为引用的类型是无操作的。将其与对引用数据成员进行操作的非静态成员函数进行比较:

      struct A {
        int &ref;
      
        // valid: const member function doesn't treat "ref" as "const int&". 
        void operate() const {
          ref = 0;
        }
      };
      

      您必须将int 传递给Foo&lt;...&gt; 才能实现您的目标。

      【讨论】:

        【解决方案3】:

        对于第二个问题,两个实例化的函数参数类型相同,而且都是模板(如果一个是模板,另一个是非模板函数,重载决议会选择后一个),所以重载决议将选择更专业的模板。一般 const T& 是比 T& 更特化的类型,所以调用第一个模板函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 2011-01-26
          • 2011-09-28
          • 2012-01-31
          • 2016-01-09
          • 2012-11-10
          • 1970-01-01
          相关资源
          最近更新 更多