A
Ares Lagae
Could someone please tell me what the behaviour of the following code
snippet is, according to the C++ standard ?
--------------------------------------------------------------------------
#include <iostream>
template <class T>
class Foo
{
public:
T m_f;
Foo(T f) : m_f(f) {}
//Foo(const Foo & foo) : m_f(foo.m_f) {}
static const Foo CONST;
};
template <class T>
const Foo<T> Foo<T>::CONST = Foo(T(1));
class Bar
{
public:
Foo<float> m_foo;
Bar() : m_foo(Foo<float>::CONST)
{
std::cout << "Foo.m_f = " << m_foo.m_f << std::endl;
}
};
Bar bar;
int main(int argc, char * argv[])
{
Bar bar;
return 0;
}
--------------------------------------------------------------------------------
On some compilers it prints "0 1", as if the static constant was not
initialized the first time, and on some compilers it prints "1 1".
I *think* (i hope not, but i could be wrong here) than the standard
behaviour is to print "1 1".
If this is in fact the case, there is a bug in each version of the MS C
compiler (tested with MSVC 6.0 and MSVC 7.0), the Intel compiler (tested
with ICC7.0/win), and in some versions of GCC (with gcc 3.3 it does
seems to work). If this is in fact a bug, is this bug known ?
Best regards,
Ares Lagae
snippet is, according to the C++ standard ?
--------------------------------------------------------------------------
#include <iostream>
template <class T>
class Foo
{
public:
T m_f;
Foo(T f) : m_f(f) {}
//Foo(const Foo & foo) : m_f(foo.m_f) {}
static const Foo CONST;
};
template <class T>
const Foo<T> Foo<T>::CONST = Foo(T(1));
class Bar
{
public:
Foo<float> m_foo;
Bar() : m_foo(Foo<float>::CONST)
{
std::cout << "Foo.m_f = " << m_foo.m_f << std::endl;
}
};
Bar bar;
int main(int argc, char * argv[])
{
Bar bar;
return 0;
}
--------------------------------------------------------------------------------
On some compilers it prints "0 1", as if the static constant was not
initialized the first time, and on some compilers it prints "1 1".
I *think* (i hope not, but i could be wrong here) than the standard
behaviour is to print "1 1".
If this is in fact the case, there is a bug in each version of the MS C
compiler (tested with MSVC 6.0 and MSVC 7.0), the Intel compiler (tested
with ICC7.0/win), and in some versions of GCC (with gcc 3.3 it does
seems to work). If this is in fact a bug, is this bug known ?
Best regards,
Ares Lagae