[c++0x] decltype(a[0]) dans gcc4.4 marche ?

) dans gcc4.4 marche ? [c++0x] decltype(a[0] - C++ - Programmation

Marsh Posté le 04-11-2009 à 23:34:27    

voici mon code:
 

Code :
  1. #include <array>
  2. #include <type_traits>
  3. std::array< char, 2 > const rule = {'e', 'f'};
  4. char b[1];
  5. static_assert( std::is_same<char, decltype(b[0])/*rule[0])*/>::value, "gcc bug ?" );


sortie:

g++ -std=c++0x c++0xtest.cpp --pedantic
c++0xtest.cpp:5: error: static assertion failed: "gcc bug ?"


si on utilise decltype(b) avec char b; ca fonctionne, normal. mais pas avec un tableau.
alors que sizeof(b[0]) fonctionne, pourquoi pas decltype ? est-ce un bug de gcc ?
 
évidemment mon but était de voir si récupérer le type de rule[0] donnait bien rule::value_type.
ceci passe tres bien par exemple:

Code :
  1. typedef std::array< char, 2 > T;
  2. static_assert( std::is_same<char, T::value_type>::value, "aie" ); //ok


mais on pouvait tres bien le faire en C++03 avec boost alors ca sert un peu a rien.


---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 04-11-2009 à 23:34:27   

Reply

Marsh Posté le 05-11-2009 à 06:52:29    

t'as essayé en 2 coups ?
 

Code :
  1. typedef decltype(b[0]) type;
  2. static_assert( std::is_same<char, type>::value, "gcc bug ?" );


 
Sinon:
http://gcc.gnu.org/gcc-4.4/cxx0x_status.html

Reply

Marsh Posté le 05-11-2009 à 21:46:46    

Joel F a écrit :

t'as essayé en 2 coups ?
 

Code :
  1. typedef decltype(b[0]) type;
  2. static_assert( std::is_same<char, type>::value, "gcc bug ?" );


 
Sinon:
http://gcc.gnu.org/gcc-4.4/cxx0x_status.html

oui j'y étais sur cette page :)
ils disent bien:

Declared type of an expression   N2343   Yes

Et d'ailleur, si je fait ca:

Code :
  1. std::cout << typeid(decltype(b[0])).name() << std::endl;
  2. std::cout << typeid(char).name() << std::endl;

j'ai bien deux fois "c" dans la console.
j'ai essayé avec le typedef entre les deux, ca ne change pas.
il me semble que le type retourné par le decltype et le type char sont bel et bien différent pour le solveur template.
(car is_same est juste une structure template<typename T, typename T> qui retourne vrai, avec une spécialisation template<typename T1, typename T2>qui retourne faux. donc la il voit pas que T est T)


---------------
http://projets.6mablog.com/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed