【发布时间】:2018-09-17 05:55:28
【问题描述】:
我必须使用不同版本的 clang 编译相同的代码。由于代码包含一些 c++17 的特性,这些特性不是每个版本的 clang 都支持的,所以我想在编译时检查它们是否受支持。据我所知,clang 的feature checking macros 是正确的方法。
我的问题特别与 std::launder 有关。
我创建了这个最小的例子:
#include "iostream"
#if __has_builtin(__builtin_launder)
void test() {
int i = 42;
std::cout << "Should compile: " << std::launder(&i) << std::endl;
}
#else
void test() {
int i = 42;
std::cout << "Should not even compile: " << std::launder(&i) << std::endl;
}
#endif
int main(){
test();
}
如果我使用clang++ -std=c++1z -stdlib=libc++ -Wall -pedantic test3.cpp && ./a.out编译它(clang 版本 6.0.0,libc++)
输出是:
Should not even compile: 0x7fff75116f64
虽然明显支持 std::launder,但内置检查不起作用。由于它与reviews llvm: Implement std::launder 中的检查相同,因此我假设检查是正确的。
我错过了什么?我觉得它是超级简单的东西,但我没有看到它。
在最坏的情况下,我会为此目的使用 cmake 的 try-compile 机制,但这似乎有点矫枉过正,我仍然有兴趣找出实际问题所在。
【问题讨论】: