Ich wollte mal etwas mit c++14 experimentieren und bin mir nicht sicher
ob ich einen Bug in gcc-5 gefunden habe, oder mein Code irgendeine C++
Regel verletzt.
GCC Version:
1 | gcc (Ubuntu 5-20150328-0ubuntu11) 5.0.0 20150328 (experimental) [trunk revision 221753]
|
2 | Copyright (C) 2015 Free Software Foundation, Inc.
|
3 | This is free software; see the source for copying conditions. There is NO
|
4 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
Den GCC hab ich von hier:
https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test
Mein Code:
1 | #include <iostream>
|
2 |
|
3 | template<typename T,std::size_t S>
|
4 | struct arr {
|
5 | typedef T Type;
|
6 | Type data[S];
|
7 | static constexpr std::size_t size(){
|
8 | return S;
|
9 | }
|
10 | };
|
11 |
|
12 | constexpr auto y(){
|
13 | auto a = arr<char,'Z'-'A'+2>();
|
14 | for(std::size_t i=0;i<a.size();i++)
|
15 | a.data[i] = 'A'+i;
|
16 | a.data[a.size()-1] = 0;
|
17 | return a;
|
18 | }
|
Meine nicht funktionierende main:
1 | auto r = y();
|
2 | // oder: const auto r = y();
|
3 | // oder: constexpr auto r = y();
|
4 | // oder: const constexpr auto r = y();
|
5 |
|
6 | int main(){
|
7 | // Ergibt nur eine Leerzeile als Ausgabe, erwarte Buchstaben A bis Z
|
8 | std::cout << r.data << std::endl;
|
9 | return 0;
|
10 | }
|
Meine zweite nicht funktionierende main:
1 | int main(){
|
2 | auto r = y().data;
|
3 | std::cout << r << std::endl; // Gibt das zeiche '@' aus
|
4 | return 0;
|
5 | }
|
Meine funktionierende main:
1 | int main(){
|
2 | auto r = y();
|
3 | // gibt "ABCDEFGHIJKLMNOPQRSTUVWXYZ" aus
|
4 | std::cout << r.date << std::endl;
|
5 | return 0;
|
6 | }
|
Meine zweite funktionierende main:
1 | int main(){
|
2 | auto r = y();
|
3 | // gibt "ABCDEFGHIJKLMNOPQRSTUVWXYZ" aus
|
4 | std::cout << y().date << std::endl;
|
5 | return 0;
|
6 | }
|
Mache ich irgendetwas falsch, oder ist das ein compilerbug?