g++10 的功能测试在 __cpp_lib_span 上失败

Top*_*ort 1 c++ g++ c++20

下面的 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;
}
Run Code Online (Sandbox Code Playgroud)

它打印警告(如下),然后继续加载<span>和使用跨度。跨度似乎在不太小的程序中也能正常工作。g++ 很好地认识到它确实支持概念 ( __cpp_concepts)。我做错了什么,还是我发现了编译器错误?

main.cpp:2:2: warning: #warning "This compiler does not support spans." [-Wcpp]
    2 | #warning "This compiler does not support spans."
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 6

_cpp_lib_*根据标准,宏不是预定义的宏(与 不同_­_­cpp_­concepts)。预定义宏的列表位于[cpp.predefined]

库功能测试宏需要包含标题。__cpp_lib_span在包含<version>或时定义<span>

在检查宏是否定义之前,您没有包含任何一个,因此在那时未定义它并不是不正确的行为。