请注意,这不是如何编写单元测试来验证编译错误?因为我不关心测试外部库或编译器本身的正确性.
它在C++中是典型的,特别是在处理模板时,采用阻止某些特定代码编译的技术.由于这些问题可能会变得复杂,确保特定代码片确实会产生编译器错误的最佳方法是什么?
由于测试甚至不应该编译,你不能依赖诸如boost-test之类的东西,所以我想它应该集成在构建系统中?这些问题通常如何处理?
简而言之:
如何编写测试,检查我的类是不可复制的还是可复制的,但只能移动并可移动分配?
一般来说:
如何编写测试,确保特定代码不编译?像这样:
// Movable, but non-copyable class
struct A
{
A(const A&) = delete;
A(A&&) {}
};
void DoCopy()
{
A a1;
A a2 = a1;
}
void DoMove()
{
A a1;
A a2 = std::move(a1);
}
void main()
{
// How to define these checks?
if (COMPILES(DoMove)) std::cout << "Passed" << std::endl;
if (DOES_NOT_COMPILE(DoCopy)) std::cout << "Passed" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我想与SFINAE有关,但有一些现成的解决方案,也许是在提升?
可能重复:
单元测试编译时错误
我想知道是否有可能编写一种单元测试来验证给定的代码不会编译。
例如,我有一个模板类:
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_base_of.hpp>
struct bar_base {};
template <typename T>
class foo
{
BOOST_STATIC_ASSERT(::boost::is_base_of<T, bar_base>::value);
};
Run Code Online (Sandbox Code Playgroud)
因此,测试应成功完成:
struct bar_derived : bar_base {};
foo<bar_derived> f;
Run Code Online (Sandbox Code Playgroud)
但应该失败:
struct bar_other {};
foo<bar_other> f;
Run Code Online (Sandbox Code Playgroud)
有什么想法如何实现这种行为?(现在,我必须取消注释失败的代码,并手动验证是否存在编译错误-我想避免这种情况)