当使用constexpr
方法作为std::enable_if_t
的参数时,旧的MSVC编译器会抱怨“函数模板已经被定义了”。G++和更新的MSVC编译器接受这一点。我如何使旧的MSCV编译器也能工作?
示例代码:
#include <climits>
#include <iostream>
#include <type_traits>
template <typename NumberType>
constexpr auto doBitCountsMatch(const int f_bitCount) -> bool {
return (static_cast<int>(CHAR_BIT * sizeof(NumberType)) == f_bitCount);
}
template <typename NumberType, int bitCount>
auto test()
-> std::enable_if_t<doBitCountsMatch<NumberType>(bitCount), NumberType> {
std::cout << "Bit counts match." << std::endl;
return 0;
}
template <typename NumberType, int bitCount>
auto test()
-> std::enable_if_t<!doBitCountsMatch<NumberType>(bitCount), NumberType> {
std::cout << "Bit counts don't match." << std::endl;
return 0;
}
int main() {
int number = 0;
test<decltype(number), 32>();
return 0;
}
在“编译器资源管理器”中:https://godbolt.org/z/15PnPhvo8:MSVC 19.14拒绝代码,MSVC 19.33接受代码。为什么旧的编译器拒绝代码?
1条答案
按热度按时间dsekswqp1#
您可以改用
std::enable_if_t
作为模板参数:Demo