编译时断言不可靠
Compile Time Assertion is Unreliable?
我正在阅读"现代C++设计"一书的第一章。特别是编译时断言。我对以下代码有一些问题:
template<bool> struct CompileTimeChecker
{
CompileTimeChecker(...) {}
};
template<> struct CompileTimeChecker<false> {};
#define STATIC_CHECK(expr, msg)
{
struct ERROR_##msg {ERROR_##msg() {}};
CompileTimeChecker<((expr) != 0)>(ERROR_##msg());
}
int main()
{
STATIC_CHECK(0, MessageNull);
STATIC_CHECK(1, MessageOne);
}
这不会引发 g++ 7.4.0 和 clang++ 6.0.0 的编译时错误。但是,以下代码确实会引发错误(如预期(:
template<bool> struct CompileTimeChecker
{
CompileTimeChecker(...) {}
};
template<> struct CompileTimeChecker<false> {};
#define STATIC_CHECK(expr, msg)
{
struct ERROR_##msg {ERROR_##msg(int i) {i;}};
CompileTimeChecker<((expr) != 0)>(ERROR_##msg(0));
}
int main()
{
STATIC_CHECK(0, MessageNull);
STATIC_CHECK(1, MessageOne);
}
第二个代码中的唯一区别是使用带有参数的构造函数。
这两种情况下的预期错误消息都是:
- G++:
no matching function for call to ‘CompileTimeChecker<false>::CompileTimeChecker(main()::ERROR_MessageNull)
叮 - 叮当当++:
no matching conversion for functional-style cast from 'ERROR_MessageNull' to 'CompileTimeChecker<(0 != 0)>'
这
被称为最令人烦恼的解析。 以下语句:
CompileTimeChecker<expr>(Type());
相当于
CompileTimeChecker<expr> Type();
它声明一个名为 Type
的函数。 您可以使用初始化的=
形式解决此问题:
CompileTimeChecker<expr> var = Type();
这样,它就不能被解释为声明。 您还可以使用自 C++11 以来的{}
初始化。 另一方面
CompileTimeChecker<expr>(Type(0));
是一个表达式语句,它根据需要创建对象Type(0)
因为它不可能声明函数。
从 C++11 开始,只需使用 static_assert
.
相关文章:
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- MS 本机单元测试 - 断言::线程失败不起作用
- 图片不显示,关闭时出错 --> 调试断言失败!表达式:is_block_type_valid(标头>_block_use)
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 编译时断言不可靠
- ncurses (Terminal Emulator) Unicode 不可靠的下标
- EN_UPDATE工作不可靠
- 在没有-DNDEBUG和-O3的情况下编译时,标准库实现不使用断言有什么原因吗
- 为什么STL实现不使用断言来检测未定义的行为
- 在delete()之后不会断言两个指针都指向NULL
- 列出迭代器不兼容断言失败
- 在不可靠的网络中,是否有任何框架可以将一个对等体上生成的数据与所有其他对等体同步
- Windows上不可靠的文件系统操作
- 在c++中写入不可靠的磁盘时引发I/O错误
- 使用勾股定理进行碰撞检测是不可靠的
- FindFirstFile、FindNextFile api不可靠吗?
- 如何使STL抛出异常而不是断言
- 从 C/C++ 调用 Prolog 时将事实传达给 Prolog(不使用断言)
- LNK2019错误:不可靠的修复"#pragma once"
- PROCESS_MEMORY_COUNTERS_EX创建不可靠的PrivateUsage字段,为什么?