为什么通过显式构造函数提升整数?

时间:2013-06-20 16:21:08

标签: c++ overload-resolution

This code

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

给出了编译错误:

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

为什么time::time(time)会被调用?当然uint64_t不允许升级?

2 个答案:

答案 0 :(得分:7)

time的复制构造函数标记为explicit,当从函数返回值时,临时从该值开始复制初始化。 C ++ 11标准的第8.5 / 15段规定:

  

形式出现的初始化
T x = a;
     

以及参数传递,函数返回,抛出异常(15.1),处理异常   (15.3),聚合成员初始化(8.5.1)称为复制初始化。 [...]

但是,标记为explicit的构造函数不会在复制初始化的上下文中考虑(参见13.3.1.4/1和13.3.1.5/1),因此会出错。

答案 1 :(得分:0)

由于time没有可访问的复制构造函数,您无法按foo的值返回time:来自volatile const time&的构造函数不匹配。扔进:

time(const time&) = default;