Почему целое число продвигается через явный конструктор?

Этот код

#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 не может быть повышен?

5

Решение

Копирующий конструктор time помечен как explicitи при возврате значения из функции временный копия инициализируется от этого значения. Пункт 8.5 / 15 стандарта C ++ 11 определяет:

Инициализация, которая происходит в форме

T x = a;

а также в передаче аргументов, возврат функции, выбрасывание исключения (15.1), обработка исключения
(15.3), и инициализация совокупного члена (8.5.1) называется копия инициализация. […]

Тем не менее, конструкторы отмечены как explicit не рассматриваются в контексте инициализации копирования (см. 13.3.1.4/1 и 13.3.1.5/1), следовательно, ошибка.

7

Другие решения

Вы не можете вернуться time по значению от foo поскольку time не имеет доступного конструктора копирования: конструктор из volatile const time& не совпадает. Добавьте в:

time(const time&) = default;
0

По вопросам рекламы [email protected]