8

このプログラムを GCC と Clang で試しましたが、どちらも何も出力しませんでした

#include <iostream>

struct A {
  A(){}

  template<typename T>
  A(T &) {
    std::cout << "copied!";
  }
};

void f(...) { }

int main() {
  A a;
  f(a);
}

私の標準の読みによると、このプログラムは を出力するはず"copied!"です。私が間違っているのか、それともこれら 2 つのコンパイラのバグなのか、誰か教えてもらえますか?

4

1 に答える 1

3

あなたが期待しているのは、標準で定義された動作であるように思われます。

テンプレート関数は、コピー コンストラクター/代入演算子の作成を妨げません。したがって、テンプレート関数は、クラスが「自明にコピー可能」であると見なされることを妨げません。ただし、実際にコピーするときにオーバーロードの解決に参加するため、干渉する可能性があります。そして、aこの例では非 const l-value であるため、実際よりも署名に適しA(A&)ていA(const A&)ます。したがって、テンプレート関数を呼び出します。

(ただし、あなたが明らかに調査を行ったので、質問でこれらすべてを説明しなかった理由はわかりません。)

ただし、これが非常に小さなケースであることを考えると、単純にコピー可能なクラスが単純にコピーされないようにするために、この動作に依存することはありません。

于 2012-11-04T04:00:29.680 に答える