#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吗?