Почему я не могу получить значение bool из value_type, возвращаемого decltype?

Это похоже на проблема. Этот код прекрасно работает в gcc но не удается скомпилировать в Visual Studio:

#include <iostream>
#include <type_traits>
#include <typeinfo>

using namespace std;

true_type foo();

template <typename T>
struct bar{
using def = conditional_t<decltype(foo())::value, char, void>;
};

int main() {
cout << typeid(bar<int>::def).name() << endl;

cout << decltype(foo())::value << endl;
}

Данная ошибка:

ошибка C2146: синтаксическая ошибка: отсутствует > перед идентификатором value

Живой пример

Есть ли исправление ошибки для этого или обходной путь?

-1

Решение

Я не уверен, может ли это помочь вам, но я могу обойти эту проблему следующим образом:

Сначала определите:

template <typename I> using id = I;

Затем замените каждый экземпляр decltype(foo())::value с

id<decltype(foo())>::value

Вы также можете использовать std::common_type_t так же:

std::common_type_t<foo()>::value

Или мои психические силы предсказывают, что вы можете просто захотеть определить отдельный тип для decltype<foo()>, для удобства:

using id = decltype(foo());

затем заменить все экземпляры decltype(foo())::value с id::value,

1

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

В вашем вопросе вы используете decltype(foo()):

using def = conditional_t<decltype(foo())::value, char, void>;
^^^^^

в то время как на Ideone, decltype(foo):

using def = conditional_t<decltype(foo)::value, char, void>;
^^^^^

Это разные вещи. В первом случае вы получаете тип результат звонка foo. Во втором вы получаете тип самой функции.


Хорошо, с того времени все изменилось кардинально.

Код был отредактирован и должен был хорошо скомпилироваться, но компиляция с Visual Studio не удалась, в то время как clang был очень доволен этим кодом и не показывал никаких ошибок и даже предупреждений.

Итак, учитывая, что лязг (последняя версия, используя --std=c++14 -Wall -Wextra) считает этот код правильным, я считаю, что это должно быть ошибка в VS.

2

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