静态断言以检查构造函数是否显式

static assert to check if constructor is explicit

本文关键字:是否 构造函数 检查 断言 静态      更新时间:2023-10-16

我正在使用Catch单元测试库。在我的一个测试用例中,我需要能够验证类中的特定构造函数是否保持为explicit(换句话说,如果删除了explicit关键字,则测试应该无法编译并显示有用的/上下文消息)。

这是我可以用static_assert做的事情吗?如果是,正确的程序是什么?我曾想过将static_assert与类型特征一起使用,但我看不到通过类型特征验证显式构造函数的方法。

仅供参考,我在GCC 4.9(NDK和Ubuntu)和VS 2015(Windows)上启用了C++14,以防"部分支持"在任何这些工具链/平台上都是一个问题。

如果不知道类的外观(并且没有Catch的背景),就不可能给出具体的答案,但使用std::is_convertible的通用解决方案相当简单:

#include <type_traits>
#include <iostream>
struct Foo
{
   Foo(int x) {}
};
struct Bar
{
   explicit Bar(int x) {}
};
int main()
{
   // The `is_convertible` trait checks for implicit convertibility
   std::cout << std::is_convertible<int, Foo>::value << 'n'; // "1"
   std::cout << std::is_convertible<int, Bar>::value << 'n'; // "0"
}

(现场演示)

您只需要断言结果是false,就可以设置了。

如果您的源类型本身是一个带有转换运算符的类,那么这可能会有些复杂,尽管在这种情况下,您试图防止的事情基本上是一样的。

相关文章: