Текущий стандарт C++ не допускает явной инициализации констант плавающего типа в объявлении класса. Не понимаю почему.
Надеюсь, что это будет исправлено. А пока можно делать так
.
/* main.cpp */
#include <iostream>
using namespace std;
/* struct Test */
struct Test
{
static const struct { operator double() const { return 3.14159; } } pi;
};
/* main() */
int main()
{
cout << "Test::pi=" << Test::pi << endl ;
return 0;
}
Фрагмент main.asm (VC++ 7.1)
; 18 : cout << "Test::pi=" << Test::pi << endl ;
fld QWORD PTR __real@400921f9f01b866e
push esi
sub esp, 8
fstp QWORD PTR [esp]
push OFFSET FLAT:??_C@_09IICHILHK@Test?3?3pi?$DN?$AA@
push OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> >
add esp, 8
mov ecx, eax
call ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
mov esi, eax
push 10 ; 0000000aH
mov ecx, esi
call ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z ; std::basic_ostream<char,std::char_traits<char> >::put
mov ecx, esi
call ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ ; std::basic_ostream<char,std::char_traits<char> >::flush