Thread overview
__traits isCopyable vs isPOD
Nov 28, 2022
Per Nordlöw
Nov 28, 2022
Per Nordlöw
Nov 28, 2022
Paul Backus
Nov 28, 2022
Per Nordlöw
Nov 29, 2022
Paul Backus
Nov 29, 2022
Per Nordlöw
November 28, 2022

For which types T does

__traits(isCopyable, T)

differ from

__traits(isPOD, T)

?

November 28, 2022

On Monday, 28 November 2022 at 20:58:43 UTC, Per Nordlöw wrote:

>

For which types T does

__traits(isCopyable, T)

differ from

__traits(isPOD, T)

?

I'm asking because I have code like

            static if (__traits(isCopyable, Element))
                insertAt(element, index);
            else
                insertAt(move(element), index);

and I wonder if one in those cases should be using isCopyable or isPOD.

November 28, 2022

On Monday, 28 November 2022 at 20:58:43 UTC, Per Nordlöw wrote:

>

For which types T does

__traits(isCopyable, T)

differ from

__traits(isPOD, T)

?

Lots of types. For example, types with copy constructors or destructors are not POD but may still be copyable.

This should be obvious if you read the definition of POD linked from the language spec: https://dlang.org/glossary.html#pod

November 28, 2022

On Monday, 28 November 2022 at 22:59:13 UTC, Paul Backus wrote:

>

Lots of types. For example, types with copy constructors or destructors are not POD but may still be copyable.

This should be obvious if you read the definition of POD linked from the language spec: https://dlang.org/glossary.html#pod

I guess I knew that, sorry for the dumb question - the real question I had is whether one should use isPOD instead of isCopyable in cases

            static if (__traits(isCopyable, Element))
                insertAt(element, index);
            else
                insertAt(move(element), index);

because that avoids any potential call to the copy-constructor and destructor of Element. Afaict, one should.

November 29, 2022

On Monday, 28 November 2022 at 23:11:37 UTC, Per Nordlöw wrote:

>

the real question I had is whether one should use isPOD instead of isCopyable in cases

            static if (__traits(isCopyable, Element))
                insertAt(element, index);
            else
                insertAt(move(element), index);

because that avoids any potential call to the copy-constructor and destructor of Element. Afaict, one should.

If your goal is to avoid calling the copy constructor (and, I assume, to avoid unnecessary instantiations of move), then yeah, isPOD is the one you want.

November 29, 2022

On Tuesday, 29 November 2022 at 00:50:54 UTC, Paul Backus wrote:

>

If your goal is to avoid calling the copy constructor (and, I assume, to avoid unnecessary instantiations of move), then yeah, isPOD is the one you want.

Thanks.