在 2025-12-8 22:03, Jonathan Wakely 写道:
In C++14 I would declare it like this:std::add_lvalue_reference_t<void (*)()> __get_once_call() noexcept; But for C++11 we don't have add_lvalue_reference, so we need the slightly uglier form: std::add_lvalue_reference<void (*)()>::type __get_once_call() noexcept;
Well, in my own code I have stuff like template<typename... _Args> using _Vfn = void (_Args...); so this could be _Vfn<>* __get_once_call() noexcept; If there's no such thing in libstdc++, I'm okay with this change.
It occurs to me that we would only need the first #ifdef group if it did something like the errno trick: #define __once_callable __get_once_callable() #define __once_call __get_once_call (and #undef at the end of the file). That way all the later code wouldn't need changes, it would continue to use __once_callable and __once_call but those would expand to calls to the getters. I don't love the use of macros with lowercase names, but it reduces the diffs between Windows and other targets to just that first #ifdef group. What do you think?
Actually I thought about this a little, and right, I don't like these macros either. The first patch tried to avoid macros in a wrong way. If these names are available as macros, I'm fine with this change too.
Do I have to send a third patch? -- Best regards, LIU Hao
OpenPGP_signature.asc
Description: OpenPGP digital signature
