【发布时间】:2020-03-22 17:33:35
【问题描述】:
你能解释一下为什么下面的代码会编译和运行吗?这里的概念是什么,这种方法的工作限制/要求是什么?
class string_wrapper
{
public:
string_wrapper(string i_string);
string m_value;
int m_length;
};
string_wrapper::string_wrapper(string i_string)
{
m_value = i_string;
m_length = i_string.length();
}
void bar(string_wrapper i_param)
{
cout << i_param.m_value << std::endl;
}
void foo()
{
string test_string = "test1";
bar(test_string);
}
int main()
{
test_function_b();
}
输出:
test1
我希望这段代码无法编译。 foo() 将一个字符串参数传递给 bar(),而 bar 只接受一个 string_wrapper 参数。但是,编译器足够聪明,知道它可以将字符串参数用作 string_parameter 对象的构造函数的参数,然后大概将其作为实际参数传递给 bar()。
这种行为是 C++ 标准中的行为,还是我的编译器(在本例中为 Visual Studio 2017 版本 15.9)所独有的?任何我可以用于进一步研究的见解或术语将不胜感激。
【问题讨论】:
-
我认为这可能对您有所帮助:en.cppreference.com/w/cpp/language/overload_resolution 您对编译器正在做什么的预感是非常正确的,但是如果您将构造函数更改为
explicit,它将无法编译。
标签: c++ constructor parameter-passing