5

这段代码

#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是不允许升职的吧?

4

2 回答 2

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),因此会出现错误。

于 2013-06-20T16:26:05.650 回答
0

您不能time按值返回 fromfoo因为time没有可访问的复制构造函数:构造函数 fromvolatile const time&不匹配。投入一个:

time(const time&) = default;
于 2013-06-20T16:48:02.677 回答