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

4

0 回答 0