【发布时间】:2014-03-25 08:14:26
【问题描述】:
我试图为这个问题写一个简单的解决方案:array decay to pointer and overload resolution
很明显,在原文中,两个重载都具有相同的转换强度(精确匹配),因此首选非模板。确实,如果我将另一个更改为模板,调用就会变得模棱两可:
struct stg
{
template<typename T = void>
stg(const char* const& c_str, T* = 0);
template<int N>
stg(const char (&str) [N]);
};
所以我想引入一个用户定义的转换,这将比第二个重载的精确匹配更糟糕。
struct stg
{
template<typename> struct cvt { operator int() { return 0;} };
template<typename T = void>
stg(const char* const& c_str, int = cvt<T>());
template<int N>
stg(const char (&str) [N]);
};
但是g++ says this is still ambiguous。为什么默认参数中的自定义转换不影响重载排名?
【问题讨论】:
-
我认为默认参数被忽略以进行重载解析?
-
@dyp:看来你的想法是对的。你能举出使它如此的规则吗?这将是一个答案。
标签: c++ type-conversion language-lawyer overload-resolution default-arguments