作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
#include <iostream>
#include <assert.h>
using namespace std;
struct Base
{
Base() : m_member1(1) {}
Base(const Base & other)
{
assert(this != &other); // this should trigger
m_member1 = other.m_member1;
}
int m_member1;
};
struct Derived
{
Derived(Base & base) : m_base(m_base) {} // m_base(base)
Base & m_base;
};
void main()
{
Base base;
Derived derived(base);
cout << derived.m_base.m_member1 << endl; // crashes here
}
上面的例子是一个错误输入的构造函数的综合版本。我在类成员 Derived::m_base
中使用了引用,因为我想确保该成员将在调用构造函数时被初始化。一个问题是 GCC 和 MSVC 都没有在 m_base(m_base)
处给我警告。但对我来说更严重的是断言发现一切都很好,后来应用程序崩溃了(有时离错误还很远)。问题:有什么办法可以指出这样的错误吗?
最佳答案
断言不会触发,因为您没有在调用 m_base(m_base)
中创建 Base
的实例。这只是初始化引用 Base& m_base
。如果您真的想调用复制构造函数,则将 m_base
声明为值 Base m_base
。
此外,捕获此类错误的一种方法是让您的编译器警告未使用的参数。 gcc 标志是 -Wunused-parameter
,或 -Wextra -Wunused
。
关于c++ - 为什么 `A & a = a` 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633164/
我是一名优秀的程序员,十分优秀!