C ++使用默认参数选择“错误”重载方法

时间:2014-01-16 11:52:25

标签: c++ gcc c++11 overloading default-parameters

我有以下界面

virtual void send_command( const std::string& command, const std::string& key, const std::string& value, bool pipeline = true );    
virtual void send_command( const std::string& command, const std::string& key, bool pipeline = true );
virtual void send_command( const std::string& command, bool pipeline = true );

在一个类中完全实现,然后我将调用如下:

c.send_command("MUTLI");
c.send_command("SET", "foo", "bar");
c.send_command("GET", "foo");
c.send_command("EXEC");

当我检查调用哪个方法实现时,我看到第三个调用( GET foo )最终命中了最后一个实现:

virtual void send_command( const std::string& command, bool pipeline = true );

其中“foo”隐式转换为bool。 “SET”,“foo”,“bar”的计数与第二个实现相同(字符串,字符串,bool) 当我使用显式c-cast进行调用时,将其转换为类似

的字符串
c.send_command("GET", (std::string)"foo");

调用预期的方法。

我正在使用gcc(GCC)4.7.2 20121109(Red Hat 4.7.2-8)和C ++ 11。

3 个答案:

答案 0 :(得分:4)

编译器倾向于通过转换为UDT(const char*)从bool转换为std::string。如果需要,也可以为const char*添加更多重载。

答案 1 :(得分:4)

你正在发现这样一个事实:指针可以隐式地转换为bool(测试它们不是null),并且字符串文字不是std::string,而是{{1在电话中衰减为const char[]。您可以做的是提供额外的重载const char*

const char*

Live example

答案 2 :(得分:1)

过载分辨率有几个步骤:首先,选择一组可行的功能。考虑省略号和/或默认参数,这些可行的函数必须具有足够的调用参数。此外,每个参数都必须可转换为相应的参数类型。对于c.send_command("GET", "foo");,你有可行的候选人

virtual void send_command( const std::string&, const std::string&, bool);
virtual void send_command( const std::string&, bool);

因为前者的第三个参数是默认的,字符串文字参数可以转换为string const&bool

在具有可行集之后,编译器会查看所需的参数转换。不需要转换,然后是内置转换,然后是用户定义的转换。在这种情况下,第一个参数的转换在两个可行的函数中都是相同的。对于第二个参数,转换为bool是buitlin,而转换为string const&则不是。因此,send_command( const std::string&, bool);优先于替代方案。