Paragraph 1.4.8 of the C++ standard (draft copy) states that
A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any well-formed program.
It turns out that, strictly speaking, this unexpectedly bans many possible extensions an implementation of the C++ standard library might provide; C++ is such a powerful beast that a well-formed program might be made to depend on the non-existence of certain entities.
Function and function templates. The following program
#include <algorithm>
using namespace std;
int any_of(int count,int n1,...){/*...*/}
int main()
{
int n=any_of(2,1023,233);
}
is valid C++03, but will fail with the upcoming C++0x revision of the standard, as this includes a function template any_of
within <algorithm>
:
template <class InputIterator, class Predicate>
bool any_of(InputIterator first, InputIterator last, Predicate pred);
that takes precedence over the user defined any_of
due to the using namespace std
directive.
Classes and class templates. Similarly, this C++03 valid program
#include <functional>
using namespace std;
template<typename T>
struct hash
{
size_t operator()(const T& t){/*...*/}
};
int main()
{
hash<int> h;
size_t s=h(983265);
}
will fail with C++0x due to the presence of an homonym hash
in <functional>
.
Member functions. The previous situations can be avoided if non-standard extensions are declared in separate headers or belong to a namespace other than std
. These measures cannot be taken, however, when we are adding members to a standard class. The following is a totally artificial yet valid C++03 program:
#include <vector>
template<class Vector>
int foo(char x){/*...*/}
template <typename T,void (T::*)()> struct mfp{};
template<class Vector>
void* foo(int x,mfp<Vector,&Vector::shrink_to_fit>* =0){/*...*/}
int main()
{
int x=foo<std::vector<int> >(0);
}
The so-called SFINAE rule prevents the second overload of foo
to be selected because vector
has no member function called shrink_to_fit
; but it does in C++0x, rendering the program invalid (the second foo
return type is not convertible to int
).
No comments:
Post a Comment