有没有办法测试编译时错误,但没有实际生成错误?例如,如果我创建一个不可复制的类,我想测试一个事实,即尝试复制它会产生编译器错误,但我还是想执行其他运行时测试.
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等的答案不感兴趣.
简而言之:
如何编写测试,检查我的类是不可复制的还是可复制的,但只能移动并可移动分配?
一般来说:
如何编写测试,确保特定代码不编译?像这样:
// 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有关,但有一些现成的解决方案,也许是在提升?
我是一名学生,我正在尝试为作业编写并运行一些测试代码,以便在提交作业之前对其进行检查。我现在要做的是测试我的代码是否正确阻止了值语义。在我的作业中,我为每个类声明了自己的私有复制构造函数和赋值运算符,但没有定义,因此什么也不做。当在我的测试程序中调用它们时,我收到了像我预期的那样的编译错误。像这样的东西:
错误:'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这是我的第一篇文章,希望我已经做了“足够”的研究,并且正确地完成了其他所有事情。抱歉,如果我没有这样做。