C ++ void_t SFINAE false_type true_type не может получить специализацию - PullRequest
4 голосов
/ 06 августа 2020

Все казалось простым.

Разве has_member_type :: value не должно быть истинным для T = vector в моем коде ниже? Извините, если на него уже ответили. Некоторое время я искал, но не нашел ответа.

#include <iostream>
#include <type_traits>

// has_value_type
template <typename, typename = std::void_t<>>
struct  has_value_type: std::false_type {};

template <typename T>
struct has_value_type<T, std::void_t<typename T::value_type>>: std::true_type {};

int main()
{
    std::cout << "bool: " << std::boolalpha << has_value_type<bool>::value << std::endl;
    std::cout << "vector_has: " << std::boolalpha << has_value_type<std::vector<int>>::value << std::endl;

    std::cout << "true_type: " << std::boolalpha << std::true_type::value << std::endl;
    std::cout << "false_type: " << std::boolalpha << std::false_type::value << std::endl;
    return 0;
}

Вывод:

bool: false
vector_has: false
true_type: true
false_type: false

Я использую clang ++

clang version 9.0.0 (tags/RELEASE_900/final)
Target: x86_64-apple-darwin17.7.0
Thread model: posix

1 Ответ

6 голосов
/ 06 августа 2020

Если вы используете реализацию стандартной библиотеки libc++ и не включаете <vector>, тогда переднее объявление std::vector вводится с:

#include <iostream> // forward declares std::vector

demo

Это предварительное объявление позволяет коду компилироваться, но проверка sfinae возвращает false, поскольку для std::vector еще не определены типы членов.

На это нельзя полагаться , и всегда должен #include<vector>, если вы хотите использовать std::vector в любом контексте.

...