On Mon, 8 Dec 2025 at 14:18, LIU Hao <[email protected]> wrote:
>
> 在 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<>*

That would be _VFn*&

>     __get_once_call() noexcept;
>
>
> If there's no such thing in libstdc++, I'm okay with this change.

No, we don't have anything like that. We could just add a local
typedef for void() or void(*)() but I don't think it's worth adding
that at namespace scope for just one use.

>
>
> > 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?

No, I can make the changes and push it, thanks.

Reply via email to