Функция MSVC constexpr «xyz» не может привести к постоянному выражениюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Функция MSVC constexpr «xyz» не может привести к постоянному выражению

Сообщение Anonymous »

Я создал функцию, которая объединяет несколько меньших значений в одно большее значение, сохраняя при этом двоичное представление значений (например, для создания int argb из нескольких беззнаковых символов r, g, b, a< /код>). Я знаю, что могу добиться этого, немного сдвинув значения, но это не является предметом данного вопроса.

Однако, если я использую функцию для фактической генерации целого числа из этих значений, msvc выдает ошибку компилятора:

Код: Выделить всё

error C3615: constexpr function 'Color::operator int' cannot result in a constant expression
note: failure was caused by call of undefined function or one not declared 'constexpr'
note: see usage of '::operator ()'
Вот полный образец. Clang и gcc компилируют код, но msvc отказывается:

Код: Выделить всё

#include 
#include 

namespace detail
{
template 
union binary_fusion_helper
{
const From from[Size];
const To to;
};

template 
constexpr To binary_fusion(Arg arg, Args... args)
{
using in_t = std::remove_reference_t;
using out_t = To;
static_assert(sizeof(out_t) == sizeof(in_t) * (sizeof...(Args) + 1), "The target type must be of exact same size as the sum of all argument types.");
constexpr size_t num = sizeof(out_t) / sizeof(in_t);
return binary_fusion_helper { std::forward(arg), std::forward(args)... }.to;
}
}

template 
constexpr auto binary_fusion = [](auto ...values) -> To
{
return detail::binary_fusion(values...);
};

struct Color
{
float r, g, b, a;

explicit constexpr operator int() const noexcept
{
return binary_fusion(static_cast(r * 255), static_cast(g * 255),
static_cast(b * 255), static_cast(a * 255));
}
};
Clang и gcc просто игнорируют тот факт, что код никогда не будет запускаться как constexpr или это ошибка msvc? И если msvc верен, почему функция не может работать во время компиляции?

Подробнее здесь: https://stackoverflow.com/questions/538 ... expression
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»