gpt4 book ai didi

c++ - 你能检测出不可编译的代码吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:43 25 4
gpt4 key购买 nike

在我们的单元测试中,我们有几行:

// Should not compile - manually checked
// auto val = ::Utils::LexicalCast<const char*>(5);

事实上,如果我取消注释这段代码,它会在 LexicalCast 中以 static_assert 失败:

static_assert(!std::is_pointer<ToType>::value, "Cannot return pointers from a LexicalCast");

因为,在这种情况下,不清楚谁拥有内存。

所以我的问题是,使用任何高级 C++ 功能(我主要考虑的是 SFINAE,但并不精通)是否可以检查是否由于调用函数中的 static_assert 而无法编译某些内容?我不介意在运行时或编译时进行检测,也不介意宏等,因为这些都是测试。

编辑:例如我想要类似的东西

ASSERT_DOESNT_COMPILE(::Utils::LexicalCast<const char*>(5));

最佳答案

以下示例显示 SFINAE 无法帮助 static_assert:

#include <type_traits>

// Fall back version that will always compile
template<class T>
void foo(T) {}

// Specific version using a static_assert that may or may not fire
template<class T>
void foo(T*) {
static_assert(std::is_same<T, char>::value, "Boo");
}

int main(int argc, char** argv) {
// This could call the fall back version, but the static_assert fires anyway
foo((int*)0);
return 0;
}

当使用 clang++ (3.4) 和 g++ (4.8.1) 编译时,static_assert 会触发,尽管根据 SFINAE 的说法它不应该触发。我的结论是 SAFIAE,即 Static_Assert Failure Is An Error。

关于c++ - 你能检测出不可编译的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com