Я пытаюсь использовать новый вывод шаблона класса С++ 17, и все это работает нормально, пока я не применяю const. Это небольшой пример проблемы, с которой я сталкиваюсь:
#include <type_traits>
template <typename T>
struct X
{
T _data;
X(void) = default;
X(T && data) : _data{ data } {}
constexpr bool const_x(void) { return false; }
constexpr bool const_x(void) const { return true; }
};
template <typename T>
X(T &&) -> X<std::remove_reference_t<T>>;
int main(void)
{
X<int> a;
const X<int> b{};
X c{ 10 };
const X d{ 10 };
static_assert(!a.const_x());
static_assert(b.const_x());
static_assert(!c.const_x());
static_assert(d.const_x()); // assert fails
}
оказывается, что когда const X выводит свои типы, константность не выполняется. Я знаю, что это возможно:
template <typename T>
X(T &&) -> const X<std::remove_reference_t<X>>;
но это сделало бы каждый выводимый тип const X.
Если у кого-то есть информация или помощь, буду очень признательна!
ИЗМЕНИТЬ Я использую GCC-7.1.0