2017-09-16 286 views
1

以下工作:C++ 11:是否有可能从函数返回一个std :: initializer_list?

struct A { 
    int i; 
    int v; 
}; 

std::initializer_list<A> getList() { 
    return {A{0,1}, A{2,3}}; 
} 

int main() { 
    auto list = getList(); 
} 

我可以验证列表的内容是正确的。

不过,如果我更改成员v到一个载体,这是行不通的:

struct A { 
    int i; 
    std::vector<int> v; 
}; 

std::initializer_list<A> getList() { 
    return {A{0,{1,2}}, A{3,{4,5}}}; 
} 

在这种情况下,返回的列表包含垃圾值。

我知道标准说复制initializer_list时不会复制下层对象。这是发生在这里吗?

为什么它在第一个例子中工作?运气好吗?当列表中的对象包含一个向量时,是否有特殊情况?

回答

1

返回initializer_list编译,但它很少做正确的事情。该列表是一个临时值,并且initializer_list对象指向它。这是一个悬挂指针。

在第一个示例中,应用了优化,因为该列表是一个常量表达式。它不是写入临时存储,而是静态的全局。但是,这个优化在标准中没有规定。返回值的工作,只是一种未定义的行为。

相关问题