我正在GCC 7.3中使用feature test macro。具体来说,我正在使用__cpp_guaranteed_copy_elision
宏测试是否可以保证复制保留。
我正在使用带有-std=c++17
标志的GCC 7.3。在这里,我实际上写代码要求确定地必须保证复制保留(我按值返回std::atomic<int>
)。该代码可以正常工作并编译。但是我的功能测试宏测试对于__cpp_guaranteed_copy_elision
始终失败。这是代码:
#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();
}
我用以下命令编译:
g++ test.cpp -o test -std=c++17
它总是输出:
Don't have it
我也尝试过:
#if defined(__cpp_guaranteed_copy_elision)
而且它仍然报告为负面。那么,GCC 7.3是否根本不支持该宏?还是我没有正确使用功能测试宏?
那么,GCC 7.3根本不支持此宏吗?
不是。 gcc直到8.3和9.1才添加此特定功能测试宏。尽管这似乎支持从7.1开始的保证复制删除,这是不幸的。您现在无能为力了。
还是我不正确使用功能测试宏?
仅检查定义的__cpp_guaranteed_copy_elision
是正确的,是的(#ifdef x
或#if defined(x)
可以)。
尽管宏的要点是能够有条件地使用功能-而且您的代码仍然需要它...所以我不确定在该功能不可用的情况下您想做什么。