Re: static const integral members
On 12 Apr., 20:06, Carl Barron <cbarron...@adelphia.net> wrote:
In article
<c908380e-e078-4863-a31c-74ff14e9f...@x41g2000hsb.googlegroups.com>,
Daniel Kr?gler <daniel.krueg...@googlemail.com> wrote:
On 11 Apr., 19:34, "Roman.Perepeli...@gmail.com"
<Roman.Perepeli...@gmail.com> wrote:
I have a question regarding the following snippet of code.
struct foo
{
static const int value = 1;
};
int main()
{
int bar = foo::value;
}
Is it valid C++?
According to the wording of ISO 14882/2nd edition
this program violates the one definition rule,
because foo::value is not defined, but used, as
shown by the quotes you provided.
Strange interpretation:
so the value const in std::integral_constant<typename T, T v>::value
is not defined either!.
I cannot follow your reasoning, mind to explain?
Just because [meta.help] does not *show* you a definition
for std::integral_constant<typename T, T v>::value is
not a proof, that it's definition is not needed.
A typical implementation looks like this (modulo namespace):
template <class T, T v>
struct integral_constant {
static const T value = v;
typedef T value_type;
typedef integral_constant<T,v> type;
};
template<class T, T v> const T integral_constant<T, v>::value;
For similar reasons you could argue that no definitions
of std::basic_string<..>::npos are required. But how can
the library implementor know, whether the user-code
takes e.g. a pointer or reference to this constant?
In this cases a definition of npos will be required
in both the current and the new C++ standard.
that is
// std headers not listed here
int main()
{
bool t = std::is_integral<double>::value; // is not define either!!!'
std::cout << t << '\n'; // t == 0 is it not??
//....
}
I seem to think there is something definitely wrong with this strange
interpretation. :)
As described above, the library implementation must
already provide a definition of std::is_integral<double>::value.
By including <type_traits> you have ensured that your
program contains the definition. Since std::is_integral
is a template, the compiler has to ensure that
the ODR is fulfilled, even if the program contains
multiple translation units that include <type_traits>,
see [basic.def.odr]/5:
"There can be more than one definition of a [..] static data
member of a class template (14.5.1.3), [..] in a program
provided that each definition appears in a different translation
unit, and provided the definitions satisfy the following
requirements[..]"
Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]