4

在尝试if constexpr基于if constexpr 和 requires-expression 实现临时概念检查时,面临以下问题:requires clause

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

4

1 回答 1

5

p是一个引用,因此decltype(p)也是一个引用类型。对于引用类型std::tuple_size将无法正常工作。所以概念检查没有通过。你可以std::remove_cvref_t用来获取普通的引用类型

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

现场演示

于 2020-02-23T12:57:04.097 回答