相关疑难解决方法(0)

单元测试一个类是不可复制的,以及其他编译时属性

有没有办法测试编译时错误,但没有实际生成错误?例如,如果我创建一个不可复制的类,我想测试一个事实,即尝试复制它会产生编译器错误,但我还是想执行其他运行时测试.

struct Foo {
    int value_;
    Foo(int value) : value_(value) {}
  private:
    Foo(const Foo&);
    const Foo& operator=(const Foo&);
};

int main()
{
    Foo f(12);
    assert(f.value_ == 12);
    assert(IS_COMPILER_ERROR(Foo copy(f);));
} // Would like this to compile and run fine.
Run Code Online (Sandbox Code Playgroud)

我想这不能简单地完成,但是有没有惯用的方法,或者我应该推出自己的解决方案(可能使用脚本编译单独的测试文件并测试结果?)?

注意:我采用不可复制的方式只是为了说明我的观点,所以我对使用boost :: noncopyable等的答案不感兴趣.

c++ unit-testing compiler-errors

16
推荐指数
2
解决办法
2288
查看次数

断言代码不编译

简而言之:

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

一般来说:

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

// 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++ 测试编译错误

我是一名学生,我正在尝试为作业编写并运行一些测试代码,以便在提交作业之前对其进行检查。我现在要做的是测试我的代码是否正确阻止了值语义。在我的作业中,我为每个类声明了自己的私有复制构造函数和赋值运算符,但没有定义,因此什么也不做。当在我的测试程序中调用它们时,我收到了像我预期的那样的编译错误。像这样的东西:

错误:'myClass::myClass(const &myClass)' 是私有的'

错误:“myClass& myClass::operator=(const myClass&)”是私有的

有没有办法使用 try/catch 以便我的测试代码可以编译并运行,但告诉我这些错误确实发生了?我试过了:

myClass obj1(...);
myClass obj2(...);
try{
  obj1 = obj2;
  throw 1;
}
catch(int e){
  assert(e==1);
}
Run Code Online (Sandbox Code Playgroud)

但编译器仍然给我上面的错误。这些不是“例外”吗?他们不会触发投掷吗?

如果我正确理解 try/catch,它会处理运行时错误,而不是我上面遇到的那种错误,对吗?

经过更多研究后,似乎没有(简单)方法可以在 C++ 中本地测试某些编译错误(现在我想起来,这对于大多数语言来说可能都是如此)。我读过一篇文章,建议用脚本语言编写一些测试代码,尝试编译 C++ 代码片段并检查是否有任何错误,另一篇文章建议使用 Boost.Build。

做我想做的事情的最简单/最好的方法是什么?

我查看了 Boost.Build 的文档,它有点超出我的理解范围。如果我使用它,我将如何测试文件(例如“test.cpp”)的编译,以及如何处理“test.cpp”发生的特定编译错误?

感谢您的帮助!

PS这是我的第一篇文章,希望我已经做了“足够”的研究,并且正确地完成了其他所有事情。抱歉,如果我没有这样做。

c++ unit-testing boost-build

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

标签 统计

c++ ×3

compiler-errors ×2

unit-testing ×2

boost ×1

boost-build ×1

c++11 ×1

sfinae ×1