template constructor vs copy-constructor

  • 以下のコードはassertion failedとなる
    • kはconst修飾されてないので、(2)が、(1)とのoverload解決に勝利する・・・参照
    • これが意図したものであることはまずないと思われるので(3)の定義を忘れないようにする
    • コンパイラが暗黙に生成するcopy-constructorでも同様
  • operator=に関しても同様

[]struct[] []klass[]

[]{[]
[]klass[][]()[]
[] { }[]

[]klass[][]([][]klass[] []const[][]&) [][]// (1)[]
[] { }[]

[]template[][]< [][]class[] []T[][] > [][]// (2)[]
[]klass[][]([][]T[][]& [][]x[][])[]
[] { [][]assert[][]([][]false[][]); }[]

[]#if[][] 0[]
[]klass[][]([][]klass[][]&) [][]// (3)[]
[] { }[]
[]#endif[]
[]};[]


[]int[] []main[][]()[]
[]{[]
[]klass[] []k[][];[]
[]klass[] []k_[][]([][]k[][]);[]
[]}[]