C++ 在GCC-7中使用功能测试宏

C++ 在GCC-7中使用功能测试宏,c++,g++,c++17,C++,G++,C++17,我正在尝试使用GCC 7.3中的。具体地说,我正在使用\ucpp\uguaranted\ucopy\u elision宏测试保证复制省略 我正在使用带有-std=c++17标志的GCC 7.3。在这里,我实际编写的代码肯定需要保证拷贝省略(我按值返回std::atomic)。代码工作正常,编译良好。然而,我的功能测试宏测试对于\uuuuCPP\uGuaranted\uCopy\uElision总是失败。代码如下: #include <iostream> #include <at

我正在尝试使用GCC 7.3中的。具体地说,我正在使用
\ucpp\uguaranted\ucopy\u elision
宏测试保证复制省略

我正在使用带有
-std=c++17
标志的GCC 7.3。在这里,我实际编写的代码肯定需要保证拷贝省略(我按值返回
std::atomic
)。代码工作正常,编译良好。然而,我的功能测试宏测试对于
\uuuuCPP\uGuaranted\uCopy\uElision
总是失败。代码如下:

#include <iostream>
#include <atomic>

std::atomic<int> F() { return std::atomic<int>{}; }

int main()
{
#if __cpp_guaranteed_copy_elision
        std::cout << "Have guaranteed copy elision" << std::endl;
#else
        std::cout << "Don't have it" << std::endl;
#endif

        std::atomic<int> a = F();
}
它总是输出:

Don't have it
我还尝试:

#if defined(__cpp_guaranteed_copy_elision)
而且报告仍然是负面的。那么GCC 7.3不支持这个宏吗?或者我是否错误地使用了功能测试宏

那么GCC 7.3不支持这个宏吗

没有。gcc直到8.3和9.1才添加这个特定的特性测试宏。尽管从7.1开始似乎支持保证的拷贝省略,但这是不幸的。你现在对此无能为力

或者我是否错误地使用了功能测试宏

检查正在定义的仅
\u cpp\u保证复制\u省略
是否正确,是(
\ifdef x
\if defined(x)
可以)

虽然宏的要点是能够有条件地使用某个特性,但在这里,您的代码仍然需要它。。。因此,我不确定在该功能不可用的情况下,您想要做什么

那么GCC 7.3不支持这个宏吗

没有。gcc直到8.3和9.1才添加这个特定的特性测试宏。尽管从7.1开始似乎支持保证的拷贝省略,但这是不幸的。你现在对此无能为力

或者我是否错误地使用了功能测试宏

检查正在定义的仅
\u cpp\u保证复制\u省略
是否正确,是(
\ifdef x
\if defined(x)
可以)

虽然宏的要点是能够有条件地使用某个特性,但在这里,您的代码仍然需要它。。。因此,我不确定在该功能不可用的情况下,您想要做什么

#if defined(__cpp_guaranteed_copy_elision)