下面的MCVE测试编译器(G++10)是否支持跨度,但给出了错误的答案。
#ifndef __cpp_lib_span
#warning "This compiler does not support spans."
#endif
#include <span>
int main(void)
{
int i[10];
std::span s(i);
return 0;
}
它打印警告(如下所示),然后继续加载并使用spans。 跨度似乎在不那么小的程序中也能很好地工作。 G++可以认识到它确实支持概念(
__cpp_concepts
)。 是我做错了什么,还是我发现了一个编译器bug?
main.cpp:2:2: warning: #warning "This compiler does not support spans." [-Wcpp]
2 | #warning "This compiler does not support spans."
根据标准,_cpp_lib_*
宏不是预定义的宏(与___cpp__concepts
)。 预定义宏的列表位于[cpp.predefined]。
库功能测试宏需要包含头。 __cpp_lib_span
在包含
或时获得定义。
在检查宏已定义之前,您没有包括任何一个,因此在此时未定义它并不是不正确的行为。