在这种情况下,为什么“ if constexpr”表现不如预期?

时间:2018-10-29 11:33:17

标签: c++ standards c++17 constexpr if-constexpr

#include <type_traits>
#include <iostream>

void f()
{}

#define M1(...) \
if constexpr (std::is_void_v<decltype(__VA_ARGS__)>)\
{ std::cout << "is_void" << std::endl; }\
else\
{ std::cout << "is_not_void" << std::endl; }

#define M2(...) \
if constexpr (std::is_void_v<decltype(__VA_ARGS__)>)\
{ __VA_ARGS__; }\
else\
{ auto tmp = __VA_ARGS__; }

int main()
{
    M1(f()); // OK! output "is_void"

    M2(f());
    // compiler error:
    // variable has incomplete type 'void' at line: auto tmp = __VA_ARGS__;
}

我的编译器是Clang 7.0。

M2中,我知道auto tmp = __VA_ARGS__;是非法的,因为decltype(__VA_ARGS__)void。但是,我使用了if constexpr,因此对我来说,编译器应忽略非法分支。

这符合C ++ 17吗?

0 个答案:

没有答案