teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2020/02/23 03:55

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -4,4 +4,9 @@
4
4
 
5
5
  明示的実体化された`Foo<int>`はテンプレートではなく型ですね。
6
6
  コンパイラは`Foo<int>& operator(Foo<int> const&)`を自動生成しますが、これはテンプレートではありません。
7
- 関数テンプレートと通常の関数では通常の関数が優先して呼び出されるため、自動生成された代入演算子がよばれたのではないでしょうか?(あまり自信なし)
7
+ 関数テンプレートと通常の関数では通常の関数が優先して呼び出されるため、自動生成された代入演算子がよばれたのではないでしょうか?(あまり自信なし)
8
+
9
+ ---
10
+ 【追記】
11
+ ならば、`Foo<T>& operator=(Foo<T> const&) = delete;`すれば良さそうなものですが、[ダメでした](https://wandbox.org/permlink/YTfpAAQYJtdqI0jV)。
12
+ 明示的に`Foo<int>& operator=(Foo<int> const&)`を[定義する](https://wandbox.org/permlink/8alhtIDor59WDn6l)しかないかも知れません。

1

微修正

2020/02/23 03:55

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -2,5 +2,6 @@
2
2
 
3
3
  `Foo<int>`へ、`Foo<int>`を代入しようとするとコンパイラが自動生成した代入演算子が呼ばれ、`Foo<double>`ならばユーザ定義の代入演算子が呼ばれるのですね。
4
4
 
5
+ 明示的実体化された`Foo<int>`はテンプレートではなく型ですね。
5
- 明示的実体化された`Foo<int>`はテンプレートではなく型ですね。コンパイラは`Foo<int>& operator(Foo<int> const&)`を自動生成しますこれはテンプレートではありません。
6
+ コンパイラは`Foo<int>& operator(Foo<int> const&)`を自動生成しますが、これはテンプレートではありません。
6
7
  関数テンプレートと通常の関数では通常の関数が優先して呼び出されるため、自動生成された代入演算子がよばれたのではないでしょうか?(あまり自信なし)