Eri*_*ric 5 c++ overload-resolution
#include <cstdint>
constexpr uint32_t ticksPerSecond = 100000;
struct timemeasure {
constexpr explicit timemeasure(uint64_t c) : ticks(c) { }
uint64_t ticks;
constexpr timemeasure() : ticks(0) { }
};
struct time : timemeasure {
static volatile time now;
constexpr time() : timemeasure() { }
explicit time(uint64_t c) : timemeasure(c) { }
// Needed for `x = time::now`
explicit time(const volatile time &t) : timemeasure(t.ticks) { }
time& operator=(volatile time t) { ticks = t.ticks; return *this; }
};
inline time foo(const time& t) { return time(t.ticks + 1); }
Run Code Online (Sandbox Code Playgroud)
给出编译错误:
prog.cpp: In function ‘time foo(const time&)’:
prog.cpp:22:57: error: no matching function for call to ‘time::time(time)’
prog.cpp:22:57: note: candidate is:
prog.cpp:14:15: note: constexpr time::time()
prog.cpp:14:15: note: candidate expects 0 arguments, 1 provided
Run Code Online (Sandbox Code Playgroud)
为什么time::time(time)要打电话?当然uint64_t不允许升职?
复制构造函数time标记为explicit,当从函数返回值时,临时从该值复制初始化.C++ 11标准第8.5/15段规定:
在表单中发生的初始化
Run Code Online (Sandbox Code Playgroud)T x = a;以及参数传递,函数返回,抛出异常(15.1),处理异常(15.3)和聚合成员初始化(8.5.1)称为复制初始化.[...]
但是,标记为的构造函数explicit不在复制初始化的上下文中考虑(见13.3.1.4/1和13.3.1.5/1),因此是错误.