This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 115b. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-08-20
According to 11.4.1 [class.mem.general] paragraph 7, a noexcept-specifier is a complete-class context. This raises an issue when the function is a friend function; for example, consider:
using T = int; struct B { friend void g(B b) noexcept(sizeof(b.m) >= 4) { } T m = T(); }; int main() { B b; g(b); }
For friend declarations you need to be able to decide at the point of declaration whether it matches a prior declaration, and you can't do that if you treat the noexcept-specifier as a complete-class context.
There is implementation divergence in the treatment of this example.
Notes from the December, 2021 teleconference:
CWG questioned why the declaration matching couldn't be deferred until the end of the class.
CWG 2022-11-10
CWG believes that, in general, a "when needed" approach to parsing complete-class contexts is superior. In the present case, the existing wording clearly requires that the noexcept-specifier be delayed-parsed, which implies that matching the declaration of a friend function to declarations at namespace scope is also delayed.