相关疑难解决方法(0)

如何对模板代码的故意编译错误进行单元测试

请注意,这不是如何编写单元测试来验证编译错误?因为我不关心测试外部库或编译器本身的正确性.

它在C++中是典型的,特别是在处理模板时,采用阻止某些特定代码编译的技术.由于这些问题可能会变得复杂,确保特定代码片确实会产生编译器错误的最佳方法是什么?

由于测试甚至不应该编译,你不能依赖诸如东西,所以我想它应该集成在构建系统中?这些问题通常如何处理?

c++ templates unit-testing

39
推荐指数
2
解决办法
4277
查看次数

断言代码不编译

简而言之:

如何编写测试,检查我的类是不可复制的还是可复制的,但只能移动并可移动分配?

一般来说:

如何编写测试,确保特定代码编译?像这样:

// 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有关,但有一些现成的解决方案,也许是在提升?

c++ boost compiler-errors sfinae c++11

16
推荐指数
3
解决办法
2511
查看次数

如何测试某些代码不能在C ++中编译?

可能重复:
单元测试编译时错误

我想知道是否有可能编写一种单元测试来验证给定的代码不会编译。

例如,我有一个模板类:

#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)

有什么想法如何实现这种行为?(现在,我必须取消注释失败的代码,并手动验证是否存在编译错误-我想避免这种情况)

c++ testing templates unit-testing compilation

5
推荐指数
1
解决办法
852
查看次数