版本80语法-参数列表中的初始化
gotw 80 syntax - initialisation in parameter list
Gotw 80包含以下示例:
// Example 1
//
#include <string>
using namespace std;
class A
{
public:
A( const string& s ) { /* ... */ }
string f() { return "hello, world"; }
};
class B : public A
{
public:
B() : A( s = f() ) {}
private:
string s;
};
int main()
{
B b;
}
文章继续讨论为什么s = f()
行是不正确的——由于对象生命周期和构造顺序。文章指出,当时编译器没有发现错误。
然而,忽略初始化顺序和对象生命周期的问题,我看不出构造函数参数列表中的s = f()
在语法上是如何合法的——它似乎试图初始化参数列表中的成员(或者可能声明默认值)。有人能解释一下这个语法是怎么回事吗?
看起来意图是调用f()
并将结果分配给B::s
。之后,该赋值的结果(即s
)将在调用继承的A
构造函数时用作实际参数。
在语法上是有效的。将表达式中的s
替换为某个非成员变量,g++将毫无问题地接受它。您可能会看到类似的语法更多地用于普通函数调用而不是构造函数调用。
语法上是合法的…当你的基类有一个带参数的构造函数时,你当然可以传递任何表达式作为形参:
strut A {
A(int) {}
};
struct B : A {
B() : A( any expression that returns an int ) {}
};
问题是,当计算示例中的表达式时,对象甚至还不是一个完全构造的A
实例,因此由于两个不同的原因,代码无效:
- 调用非实例的
A
方法(构造函数尚未启动):f()
调用是非法的。 - 分配给未初始化的成员:
s=...
是非法的
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 在初始化列表之外手动调用基类的构造函数
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- std::map与谓词与初始化列表
- 类内初始化与构造函数初始化列表的顺序
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++初始化列表与分配值
- C++初始化列表中的向量集大小或调整大小
- 在构造函数初始化列表中使用 std::variant
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 解释了构造函数成员初始化列表
- 使用初始化列表时如何获取私有数据?
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 如何在成员初始化列表中声明共享指针
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 使用整数初始化列表初始化长双精度的向量
- 是否可以在C++中使用初始化列表设置数组的特定成员?