如何为已删除的默认构造函数编写测试

How to write a test for a deleted default constructor

我有一个 class A 我删除了默认构造函数。

class A {
  public:
    A() = delete;
    A(int a): m_myInt(a) {}
  private:
    const int m_myInt;
};

int main () {
    A foo(1);  // works perfect
    A bar;   // won't compile
}

如何编写良好的单元测试以确保 A bar; 仍然无效?我可以写一个不编译的测试并将编译错误作为测试要求。不知有没有更好的写单元测试的方法?

2) 如果std::is_trivially_constructible<T>::value为真,则提供等于true的成员常量值,否则值为false.

http://en.cppreference.com/w/cpp/types/is_default_constructible

你可以为此使用特征:

static_assert(!std::is_constructible<A>::value, "!");

依赖于确认某些代码结构无法编译的单元测试并没有错。单元测试的目的是确定一段或多段代码是否共同 "fit for use" - 并且标准可以表示功能或 non-functional(例如质量)属性。如果 "fit for use" 标准是 "code will not compile if ....." 那么一个明显的方法是编写一个单元测试,故意寻求导致编译失败。

对于编译器来说,这无疑是一种有效的单元测试方法 - 在这种方法中,测试编译器如何响应错误代码样本完全适合作为单元测试或单元测试集。

鉴于要求是 A 的 default-instantiation(使用 OP 的话)"remains not valid",通过单元测试的基本标准是编译失败执行

的代码
  A bar;

根据要求,此类代码可能需要在不同的上下文中进行测试(例如,在属于 A 的成员或友元的检测函数中、在不相关的函数中、在文件范围内等)。所以这个需求可能需要一组单元测试。

要实现这样的测试,构建过程需要捕捉编译是否失败。成功的编译需要被捕获为失败的测试,相反,失败的编译需要被捕获为通过的单元测试。

根据需要捕获多少证据来证明通过(或失败)单元测试的声明是正确的,构建过程可能需要捕获和解析编译器诊断信息——例如,确定编译器中的哪些行源文件实际上导致编译失败。

同样,可能需要一个单元测试或一组单元测试来检查某些代码结构是否编译。