“func”将C类的常量引用作为其参数。 但我错误地将字符串传递给它。
我预计会得到一个错误,比如“没有匹配的函数......”“没有来自......的已知转换”,但是编译完成没有任何错误,并且程序会出现分段错误。
为什么即使函数的参数不正确,编译器也不会导致错误?
编译器的版本 clang ++ 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 :(得分:4)
由于您的构造函数可以从C
生成std::string
,因此它基本上将func( _s )
编译为func( C( _s ) )
。对我们来说很明显,这只会导致无限递归并使程序崩溃(因为该函数是您现在所使用的函数),但从技术上讲,它不是无效的C ++,因此编译器允许它。如果你不希望这个工作,你可以声明你的构造函数explicit
,这意味着除非你明确地调用它,否则编译器永远不会使用它。