[libcxx-dev] Providing custom template specialization for std::optional?

Michał Dominiak via libcxx-dev libcxx-dev at lists.llvm.org
Sat Mar 9 17:02:06 PST 2019


This sentence is about *variable* templates, not "variadic" templates.

On Sat, Mar 9, 2019, 9:57 AM Владимир Гончаров via libcxx-dev <
libcxx-dev at lists.llvm.org> wrote:

> Where does the standard say that?
>
>
> [namespace.std].3 <http://eel.is/c++draft/namespace.std#3>: The behavior
> of a C++ program is undefined if it declares an explicit or partial
> specialization of any standard library variable template, except where
> explicitly permitted by the specification of that variable template.
>
> On 9 Mar 2019, at 04:49, Eric Fiselier <eric at efcs.ca> wrote:
>
>
>
> On Thu, Mar 7, 2019 at 10:18 AM Владимир Гончаров <dev.zelta at gmail.com>
> wrote:
>
>> Can you explain what your specialization does differently? And why it's
>> needed?
>>
>>
>> I have a class which is a C++ interface for an object defined in a C
>> library. Internally, it is a pointer which can never be null (if C
>> interface returns null, the class constructor throws).
>> I want to use this fact to optimise optional's storage. That would allow
>> shrinking optional's size to eight bytes. Since we store a lot of optionals
>> of this class, this change would reduce memory usage by about five percent
>> (I've done some testing).
>> I really don't want to invent a new optional specifically for this case.
>> I also don't want to allow storing null pointers inside of the original
>> class because this would require an assert before almost any usage of the
>> class.
>>
>> I think the standard is being too permissive here.
>>
>>
>> Maybe it is. But again, if I can provide a more efficient specialization
>> which would utilise some knowledge about the wrapped type, why shouldn't I?
>>
>> `<variant>` is a good example.
>>
>>
>> By the way, providing custom specializations for variadic templates is
>> forbidden =)
>>
>
> Where does the standard say that?
>
>
>>
>> Kind regards, Vladimir Goncharov
>>
>> On 7 Mar 2019, at 08:39, Eric Fiselier <eric at efcs.ca> wrote:
>>
>>
>>
>> On Wed, Mar 6, 2019 at 5:41 PM Владимир Гончаров via libcxx-dev <
>> libcxx-dev at lists.llvm.org> wrote:
>>
>>> Hello!
>>>
>>> I'm implementing a specialization for std::optional for my
>>> program-defined type.
>>>
>>
>> Can you explain what your specialization does differently? And why it's
>> needed?
>>
>>
>>> As I understand *[namespace.std]*, nothing forbids me from doing that.
>>>
>>
>> I agree that you've interpreted the standard correctly. But I think the
>> standard is being too permissive here.
>> Implementing a complex component may necessitate knowledge of the
>> internals. `<variant>` is a good example.
>>
>> I would like to know what other library maintainers think.
>>
>> /Eric
>>
>>
>>
> _______________________________________________
> libcxx-dev mailing list
> libcxx-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/libcxx-dev/attachments/20190310/d0841d9f/attachment.html>


More information about the libcxx-dev mailing list