考虑以下两个类:
#define PRETTY(x) (std::cout << __PRETTY_FUNCTION__ << " : " << (x) << '\n')
struct D;
struct C {
C() { PRETTY(this);}
C(const C&) { PRETTY(this);}
C(const D&) { PRETTY(this);}
};
struct D {
D() { PRETTY(this);}
operator C() { PRETTY(this); return C();}
};
Run Code Online (Sandbox Code Playgroud)
我们对两个构造函数之间的重载解析感兴趣:
C::C(const C&);
C::C(const D&);
Run Code Online (Sandbox Code Playgroud)
此代码按预期工作:
void f(const C& c){ PRETTY(&c);}
void f(const D& d){ PRETTY(&d);}
/*--------*/
D d;
f(d); //calls void f(const D& d)
Run Code Online (Sandbox Code Playgroud)
因为void f(const D& d)是一个更好的匹配.
但是:
D d;
C c(d); …Run Code Online (Sandbox Code Playgroud) 考虑标准中的Forward迭代器的定义(草案n4659,[forward.iterators] /27.2.5):
类或指针类型
X满足前向迭代器的要求
X满足输入迭代器的要求(27.2.3),X满足DefaultConstructible要求(20.5.3.1),- 如果
X是可变迭代器,reference则引用T; ifX是一个常量迭代器,reference是一个引用const T,- 表97中的表达式是有效的,并具有指示的语义,和
- 对象类型
X提供多次通过保证,如下所述.[注意省略]两个可解除引用的迭代器a和b类型X提供多次通过保证,如果:
a == b暗示++a == ++b和X是指针类型或表达式(void)++X(a), *a等价于表达式*a.[注意:
a == b暗示的要求++a == ++b(对于输入和输出迭代器不是这样)以及通过可变迭代器(适用于输出迭代器)去除对赋值数量的限制允许使用多遍 -具有前向迭代器的定向算法. - 结束说明][表97省略]
- 如果
a和b是相等的,则要么a和b都提领要不然也不是提领.- 如果
a和b都是可解除引用的,那么 …