Проблема с требованием внутри, если constexpr - PullRequest
4 голосов
/ 23 февраля 2020

При попытке реализовать if constexpr с requires clause на основе , если constexpr и require-expression для ad-ho c, проверка концепций сталкивается со следующей проблемой:

template<class P>
concept TuplePair = requires(P p) {
    requires std::tuple_size<P>::value == 2;
    std::get<0>(p);
    std::get<1>(p);
};

void print(const auto& p) {
    if constexpr( TuplePair<decltype(p)> ) {
        std::cout << std::get<0>(p) << ", " << std::get<1>(p) << std::endl;
    }
    else {
        std::cout << "else" << std::endl;
    }
}

int main() {
    // justifiably prints 'else':
    print(std::make_tuple(3, 4, 5));

    // prints 'else' even though this is a valid TuplePair:
    print(std::make_tuple(1, 2));
}

Что не так с if constexpr requires clause?

1 Ответ

5 голосов
/ 23 февраля 2020

p является ссылкой, и поэтому decltype(p) является ссылочным типом. Для справочного типа std::tuple_size не будет работать правильно. Так что проверка концепции не проходит. Вы можете использовать std::remove_cvref_t для получения простого референтного типа

TuplePair<std::remove_cvref_t<decltype(p)>>

Live Demo

...