小编Bru*_*uno的帖子

在重载解析期间调用转换运算符而不是在c ++ 17中转换构造函数

考虑以下两个类:

#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)

c++ language-lawyer c++14 c++17

22
推荐指数
1
解决办法
604
查看次数

前向迭代器的多次通过保证的强度

考虑标准中的Forward迭代器的定义(草案n4659,[forward.iterators] /27.2.5):

类或指针类型X满足前向迭代器的要求

  • X 满足输入迭代器的要求(27.2.3),
  • X满足DefaultConstructible要求(20.5.3.1),
  • 如果X是可变迭代器,reference则引用T; if X是一个常量迭代器,reference是一个引用const T,
  • 表97中的表达式是有效的,并具有指示的语义,和
  • 对象类型X提供多次通过保证,如下所述.[注意省略]两个可解除引用的迭代器ab类型X提供多次通过保证,如果:
    • a == b暗示++a == ++b
    • X是指针类型或表达式(void)++X(a), *a等价于表达式*a.

[注意:a == b暗示的要求++a == ++b(对于输入和输出迭代器不是这样)以及通过可变迭代器(适用于输出迭代器)去除对赋值数量的限制允许使用多遍 -具有前向迭代器的定向算法. - 结束说明]

[表97省略]

  • 如果ab是相等的,则要么ab都提领要不然也不是提领.
  • 如果ab都是可解除引用的,那么 …

c++ c++-standard-library language-lawyer

6
推荐指数
1
解决办法
171
查看次数