Created on 2010-10-10.00:00:00 last changed 162 months ago
Proposed resolution:
The wording refers to N3126.
Change 20.8.2 [func.require]/1 as indicated:
1 Define INVOKE(f, t1, t2, ..., tN) as follows:
- ...
- ...
- t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of a type derived from T;
- (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types described in the previous item;
- ...
[ Adopted at 2010-11 Batavia ]
[ Post-Rapperswil ]
Moved to Tentatively Ready after 5 positive votes on c++std-lib.
20.8.2 [func.require] p1 says:
1 Define INVOKE(f, t1, t2, ..., tN) as follows:
- (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of a type derived from T;
- ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of the types described in the previous item;
- t1.*f when f is a pointer to member data of a class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of a type derived from T;
- (*t1).*f when f is a pointer to member data of a class T and t1 is not one of the types described in the previous item;
- f(t1, t2, ..., tN) in all other cases.
The question is: What happens in the 3rd and 4th bullets when N > 1?
Does the presence of t2, ..., tN get ignored, or does it make the INVOKE ill formed?
Here is sample code which presents the problem in a concrete example:
#include <functional> #include <cassert> struct S { char data; }; typedef char S::*PMD; int main() { S s; PMD pmd = &S::data; std::reference_wrapper<PMD> r(pmd); r(s, 3.0) = 'a'; // well formed? assert(s.data == 'a'); }
Without the "3.0" the example is well formed.
[Note: Daniel provided wording to make it explicit that the above example is ill-formed. — end note ]
History | |||
---|---|---|---|
Date | User | Action | Args |
2011-08-23 20:07:26 | admin | set | status: wp -> c++11 |
2010-11-23 13:22:14 | admin | set | messages: + msg5410 |
2010-11-14 13:10:57 | admin | set | status: voting -> wp |
2010-11-08 14:14:39 | admin | set | status: ready -> voting |
2010-10-21 19:47:27 | admin | set | messages: + msg4887 |
2010-10-21 19:47:27 | admin | set | messages: + msg4886 |
2010-10-10 00:00:00 | admin | create |