【问题标题】:unreachable-code In C++11, what may cause this?unreachable-code 在 C++11 中,什么可能导致这种情况?
【发布时间】:2020-06-16 17:23:39
【问题描述】:

我在 Clion 中为我的 C++11 编写了以下代码:

Matrix<T> &Matrix<T>::operator=(const Matrix<T> &matrix) {
    if (this == &matrix) {
        return *this;
    }
    int matrix_size = matrix.size();
    T *temp = new T[matrix_size];
    try {
        for (int i = 0; i < matrix_size; ++i) {
            temp[i] = data[i];
        }
    }
    catch (...)
    {
        delete[] temp;
        throw;
    }
    delete[] data;
    data = temp;
    dimensions = matrix.dimensions;
    return *this;
}

但是它告诉我catch里面写的是一个无法访问的代码,这是为什么呢?

【问题讨论】:

  • @ThomasSablik 复制 T 可能会抛出异常。
  • 我的猜测是,由于模板是在编译时评估的,因此您实际上并没有为 T 使用具有抛出复制操作的类型,并且编译器设法看到了这一点。也许尝试为 T 使用一些可能会抛出它的复制赋值运算符的东西,看看这是否会使警告消失。但这只是猜测。
  • FWIW,如果您使用 std::vector 而不是使用 new 手动创建数组,您甚至无需担心。

标签: c++ class generics operator-overloading


【解决方案1】:

Clion 可能是错的。如果 T 抛出复制分配,这显然不是不可访问的。

Demo

我可以看到评估正确的唯一方法是检查Matrix 的每个实例并确保在每种情况下使用的类型都不会抛出。但是,我仍然不同意它,因为 Matrix 可以在 Clion 无法访问的地方使用。

请注意,无论如何您都不应该这样编码。使用 std::vector 而不是原始指针和动态分配。那么你就不需要 try-catch 块了:std::vector 会为你解决这个问题。

另外,我相信你的意思是在循环中写 temp[i] = matrix.data[i];

【讨论】:

  • 是的,每当我使用 try/catch 执行任何操作时,CLion 都会给我一堆无法访问的错误。超级奇怪。
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多