MSVC编译器中std::enable_if嵌套使用失效问题咨询
MSVC编译std::enable_if嵌套代码失败的问题
我写了一段用于理解std::enable_if的代码,经测试发现:
- 在GCC 6.3.0及以上版本可正常编译
- 在MSVC 2015、2017、2019各版本中均编译失败
我怀疑这和嵌套使用std::enable_if有关——移除bitSize函数的std::enable_if约束后,代码即可正常运行。
编译失败的代码
#include <cstdint> #include <iostream> template <typename T, typename std::enable_if<(std::is_arithmetic<T>::value), bool>::type = true> constexpr std::size_t bitSize() { return sizeof(T) * 8; } template <typename T, typename std::enable_if <(bitSize<T>() == 8), bool>::type = true> void f(T val) { std::cout << "f val = " << val << std::endl; } int main() { uint8_t u8 = 1; f<uint8_t>(u8); return 1; }
MSVC编译报错信息
main.cpp(10,49): error C2672: 'bitSize': no matching overloaded function found main.cpp(5,23): message : could be 'size_t bitSize(void)' main.cpp(10,60): message : 'size_t bitSize(void)': could not deduce template argument for '__formal' main.cpp(18,2): error C2672: 'f': no matching overloaded function found main.cpp(11,6): message : could be 'void f(T)' main.cpp(18,15): message : 'void f(T)': could not deduce template argument for '__formal'
编译成功的代码(移除bitSize的enable_if约束)
#include <cstdint> #include <iostream> template <typename T> constexpr std::size_t bitSize() { return sizeof(T) * 8; } template <typename T, typename std::enable_if <(bitSize<T>() == 8), bool>::type = true> void f(T val) { std::cout << "f val = " << val << std::endl; } int main() { uint8_t u8 = 1; f<uint8_t>(u8); return 1; }
请问这是已知问题还是我存在认知疏漏?
内容的提问来源于stack exchange,提问作者Septimiu Neaga
相关产品推荐
相关产品推荐

