This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/66672] std::is_same wrong result for captured reference value inside a lambda
- From: "deaeod at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sun, 26 Nov 2017 12:11:14 +0000
- Subject: [Bug c++/66672] std::is_same wrong result for captured reference value inside a lambda
- Auto-submitted: auto-generated
- References: <bug-66672-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66672
Lukas <deaeod at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |deaeod at gmail dot com
--- Comment #2 from Lukas <deaeod at gmail dot com> ---
I think gcc's result of 10 is correct, and i believe every other compiler is
wrong.
Consider the following passages:
http://eel.is/c++draft/expr.prim.lambda#capture-11.sentence-3
-- "An id-expression that is not an odr-use refers to the original entity,
never to a member of the closure type."
http://eel.is/c++draft/basic.def.odr#def:potentially_evaluated
-- "An expression is potentially evaluated unless it is an unevaluated
operand or a subexpression thereof."
http://eel.is/c++draft/basic.def.odr#def:odr-used
-- "A variable x whose name appears as a potentially-evaluated expression
ex is odr-used by ex unless [...]"
http://eel.is/c++draft/dcl.type.simple#4.sentence-3
-- "The operand of the decltype specifier is an unevaluated operand."
Combining (1) and (3) means that variable names refer to the original entity,
not the member of the closure, unless that variable name appears in a
potentially evaluated expression.
(2) and (4) combined say that the operand of decltype is not a potentially
evaluated expression.
Thus, variable names inside a decltype expression always refer to the outside
entities.