为什么我可以无错误地编译此代码,即使我传递了无效的类型参数?

时间:2017-03-09 04:26:28

标签: c++

“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" ) ;
}

1 个答案:

答案 0 :(得分:4)

由于您的构造函数可以从C生成std::string,因此它基本上将func( _s )编译为func( C( _s ) )。对我们来说很明显,这只会导致无限递归并使程序崩溃(因为该函数是您现在所使用的函数),但从技术上讲,它不是无效的C ++,因此编译器允许它。如果你不希望这个工作,你可以声明你的构造函数explicit,这意味着除非你明确地调用它,否则编译器永远不会使用它。