2017-06-26 8 views
9

問題の機能縮小版を以下に示します。initializer_listとGCC 4.9.2

#include <initializer_list> 
#include <iostream> 

enum objects { zero, one, two, three, four, five, six, seven }; 

std::initializer_list<objects> objects_list() 
{ 
    return { zero, one, two, three, four, five, six, seven }; 
} 

int main() 
{ 
    for (auto a : objects_list()) 
    { 
     std::cout << a << ' '; 
    } 
    std::cout << '\n'; 
} 

私の期待はあるが、そのプログラムの出力:

0 1 2 3 4 5 6 7 

によって確認済みれますGCC 4.9.2ですが、gitリポジトリから新鮮なGCCは、

0 0 -85997960 32712 -1076836160 32765 0 32 

となり、基本的には乱数のようです。

私のプログラムやGCCに問題はありますか?

+3

私はgcc 7.1.1を5月下旬から持っています。私は再現できません。たぶん、いくつかの新しいプル要求がこのバグを紹介したのだろう – Rakete1111

+2

ここでは重要ではありませんが、ループ内でコピーを必要としないときはいつも 'for(const auto&a:...')を使用します。 –

+3

[ここで再現可能](https: /wandbox.org/permlink/s40JCmvSLE8doIO2)。非常に奇妙です。 – NathanOliver

答えて

5

N4296§8.5.4/5状態

実装 がNは数あるタイプconst EN要素の一時的な配列を、割り当てられたかのようにタイプstd::initializer_list<E>のオブジェクトが初期化リストから構成されています 初期化リストの要素のその配列の各要素は、コピー初期化初期化子 リストの対応する要素であり、そしてstd::initializer_list<E>オブジェクトが

だから我々は std::initializer_listは一時的な配列を参照していることを告げているその配列を参照するように構成されています。

及び§8.5.4/6状態

アレイは、任意の他の一時オブジェクト

と同じ寿命を有しており、標準の後に初期化リストにアクセスすることを実証するために、この例を提供し、その配列は、スコープの外に出た未定義の動作です:

struct A { 
std::initializer_list<int> i4; 
A() : i4{ 1, 2, 3 } {} // creates an A with a dangling reference 
}; 

initializer_listオブジェクトはコンストラクタの ctor-initializerで初期化されるため、コンストラクタが終了するまでは配列が維持されるため、コンストラクタの終了後にi4 という要素を使用すると未定義の動作が発生します。 -end例]

あなたがコピーすることを含む、同様の、しかしわずかに異なる実施例を有する:標準から論理によって

std::initializer_list<objects> objects_list() 
{ 
    return { zero, one, two, three, four, five, six, seven }; 
} 

を、アレイ{zero, one, two, ...}のみobjects_list関数の期間持続します。

[std::] initializer listが根底にある要素をコピーしないコピー:

18.9/2 [support.initlist】またコピー元の配列を保持しないことを支持しています。

あなたのコードは最終的にUBだと思うし、前に働いたことは運が良かったと思う。

+1

ありがとうございます。これは、新しいコンパイラを試すのにはいつもお金がかかることを示しています。そして、これらの年月を経てもC++はまだ理解できません。 – cschwan

+1

@cschwan:あなたと私の両方。この質問は私に 'std :: initializer_list'についての新しいことを学ぶことを許し、それについて私はあなたに感謝します。 – AndyG

+1

私はこの動作が非常に怪しいと言わなければなりません – vsoftco

関連する問題