【发布时间】:2016-02-12 11:23:15
【问题描述】:
考虑以下代码:
#include <iostream>
struct Data
{
int x, y;
};
Data fill(Data& data)
{
data.x=3;
data.y=6;
return data;
}
int main()
{
Data d=fill(d);
std::cout << "x=" << d.x << ", y=" << d.y << "\n";
}
这里d 是从fill() 的返回值复制初始化的,但fill() 在返回其结果之前写入d 本身。我担心的是 d 在被初始化之前是非平凡使用的,并且在某些(所有?)情况下使用未初始化的变量会导致未定义的行为。
那么这段代码是有效的,还是有未定义的行为?如果它是有效的,一旦Data 停止成为 POD 或在其他情况下,行为是否会变得未定义?
【问题讨论】:
-
这太丑了,你这是谁干的?`
-
为什么不给 Data 一个合适的构造函数呢?另外,请参见此处:stackoverflow.com/questions/4782757/…
-
相关问题:Is passing a C++ object into its own constructor legal? 这不是构造函数,但在这种情况下,参数也都相似。
-
@MichaelWalz 我同意这很丑陋,但这是我最近才了解如何正确实施的事情的简化版本。所以现在只是好奇它是否有效。
-
标签: c++ initialization language-lawyer undefined-behavior