2017-06-27 5 views
1

がここに捕まってしまった++ブルースEckel氏TICを通過しながら、(第1巻)CH-12 Q-21

、 第二引数を持つ代入演算子とデフォルトを持っている文字列をクラスを作成します。値は は「op = call」と表示されます。クラスのオブジェクト を別のクラスに割り当てる関数を作成し、 代入演算子が正しく呼び出されたことを示します。

これは本当に可能ですか? C++は演算子=()に複数の引数を持たせることができますか?私はこれを試してみました:コンパイラによって与え

class X 
{ 
public: 
    X& operator=(const X& x, string val = "op=call") //! error 
    { 
     // ... 
    } 
}; 

int main() 
{ 
    X x1; 
    X x2; 
    x2 = x1; 
} 

エラー:

[Error] 'X& X::operator=(const X&, std::string)' must take exactly one argument 

私は、これは有効な質問ではありませんか、それは代入演算子に複数の引数を提供するために、どのようにしている場合だと思います?

+0

'val'のポイントは何ですか?平等の点検に第三の議論が必要なのはなぜですか?それが完全にデフォルトの行動に依存しない限り、その議論はどのように与えられるでしょうか? – Carcigenicate

+3

[私は別の本を見つける](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – NathanOliver

+0

正しい。 3番目の議論を追加する意味はありません。私たちがそうしようとしても、コンパイラは厳密なエラーを出します。**正確に1つの引数** –

答えて

1

最新のバージョンThinking in C++、Vol 1が2001年に発行されました。その後、新しいC++標準が3回発行されました(2003年、2011年および2014年)。

私の推測では、Eckelは後で修正された標準で抜け穴を示していると思います。 (または、おそらく、私が前提としているこの抜け穴がこのような致命的なケースであるため、あなたのコンパイラはスタンダードに厳密に従うのではなく意図した動作を誤って実装しているだけかもしれません)

+0

C++ 98でも、コピー代入演算子(またはオーバーロードされた代入演算子)私はあなたの最後の文が正しいと思う - その本の例は初期のコンパイラの事故に頼っていた。 –

+0

VC++ 6でも2番目のパラメータで代入演算子をコンパイルしません。 –

関連する問題