我知道如果没有为类声明构造函数,编译器将生成一个。
但是,在编译了以下(g ++或clang ++)并使用此代码执行nm -C
之后 - 具有非POD数据成员 - 我确实看到了生成的Ctor:
class X
{
public:
void SetName(std::string name) {m_name = name;}
private:
std::string m_name;
};
int main()
{
X x1;
x1.SetName("jude");
return 0;
}
但是使用此代码 - 使用POD数据成员 - 我不会:
class X
{
public:
void SetNum(int num) {m_x = num;}
private:
int m_x;
};
int main()
{
X x1;
x1.SetNum(8);
return 0;
}
我以为在这两种情况下我都会看到生成的构造函数。这种行为是否符合标准?或者这是其他什么东西在这里发生?
答案 0 :(得分:4)
在
的情况下class X
{
public:
void SetName(std::string name) {m_name = name;}
private:
std::string m_name;
};
必须生成构造函数,因为m_name
需要默认构造。
在
的情况下class X
{
public:
void SetNum(int num) {m_x = num;}
private:
int m_x;
};
默认构造m_x
与不执行任何操作相同,因为变量未初始化。由于不生成和调用构造函数会使构造函数做同样的事情,编译器可以在"as-if" rule下对其进行优化。
答案 1 :(得分:0)
nm -C
的输出不受as-if规则的约束。请记住,inline
只是对编译器的一个提示,它可以使用它认为合适的任何其他提示 - 包括函数的复杂性。显然,这两个构造函数的复杂程度各不相同。实际上,在POD情况下,生成的ctor实际上是微不足道的,编译器内联它是完全合理的。