Re: Isn't this a conversion bug in gcc?
On 30 Jul, 19:18, Daniel Kr?gler <daniel.krueg...@googlemail.com>
wrote:
Even though B<int>::f is not required to exist in any general program
Did you mean "_a definition of_ B<int>::f is not required to exist"?
it is required to exist in this particular program, because it is
still used
in the sense of the *general* requirements specified in 3.2/2:
"An expression is potentially evaluated unless it is an unevaluated
operand (Clause 5) or a subexpression thereof. A variable or non-
overloaded function whose name appears as a potentially-evaluated
expression is used unless it is an object that satisfies the
requirements for appearing in a constant expression (5.19)
and the lvalue-to-rvalue conversion (4.1) is immediately applied.[..]"
The example invokes the constructor of B as part of a potentially
evaluated expression. Note that the refining sentence:
"A virtual member function is used if it is not pure."
does not declare a pure virtual function as *unused*, it only declares
*any* non-pure virtual function as *used*.
I can't accept this explanation. Lets consider more simple example:
struct AbstractBase
{
virtual void f() = 0;
};
struct Derived : AbstractBase
{
void f() { /*...*/ }
};
void g(AbstractBase &x)
{
x.f();
}
int main()
{
Derived d;
g(d);
}
If the function AbstractBase::f is used, we shall apply 3.2/3:
"Every program shall contain exactly one definition of every non-
inline function or object that is used in that
program; no diagnostic required."
So, the program above would be ill-formed and in general undefined
pure virtual functions would be almost useless? Then the wording
"A pure virtual function need be defined only if explicitly called
with the qualified-id syntax (5.1)." (10.4/2)
is wrong?
This is a big difference,
because it does not make the former requirements invalid.
In any case the specification is bad.
I can point out another issue:
namespace N
{
struct A {};
void f(A, int) { /*...*/ }
}
void f(N::A, long) { /*...*/ }
int main()
{
f(N::A(), 0);
}
Are functions N::f and ::f overloaded? No? Then which functions are
used according to literal interpretation of 3.2/2? Both? :-)
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]