2017-03-09 6 views
0

"func"は引数としてクラスCの定数参照をとります。 しかし、私は間違ってそれに文字列を渡した。無効な型引数を渡しても、このコードをエラーなしでコンパイルできますか?

"no matching function ..." "no known conversion from ..."のようなエラーが発生することが予想されますが、コンパイルはエラーなしで完了し、プログラムはセグメンテーション違反を取得します。

関数の引数が間違っていても、コンパイラがエラーを引き起こさないのはなぜですか?あなたはstd::stringからCを作ることができるコンストラクタを持っているので、それはfunc(C(_s))であるかのように、コンパイラ 打ち鳴らす++ 3.9.1 G ++ 6.3.1

#include <iostream> 
#include <string> 

class C ; 

void func(const C &_c) 
{} 

class C 
{ 
public : 
    C(const std::string &_s) 
    { 
     func(_s) ; 
    } 
} ; 

int main() 
{ 
    C c("foo") ; 
} 
+0

無効な場合は無効です。コンパイラは何をしたいですか?それが正当なふりをしますか? 'std :: string'を' C'を要求しているものに渡しています。あなたはテンプレート関数をお探しですか? – tadman

答えて

4

バージョンでは、それは基本的にあなたのfunc(_s)をコンパイルしました。これが無限の再帰を引き起こし、プログラムをクラッシュさせることは明らかです(その関数は現在の関数なので)。しかし、技術的には無効なC++ではないので、コンパイラはそれを許しました。これを動作させたくない場合は、コンストラクタexplicitを宣言することができます。これは、明示的に呼び出さない限り、コンパイラは決して使用しないことを意味します。

+0

非常に明確な答えをありがとうございます。 私は理解しています。 – user7681961

関連する問題