Функция-член, которая не является константой, должна быть только constexpr, если на C ++ 14 или позже - PullRequest
0 голосов
/ 16 декабря 2018

В C ++ 11 constexpr для функции-члена подразумевает const.Это было изменено в C ++ 14.

У меня есть некоторый код, который имеет функцию-член, которая должна быть constexpr, но не может быть const, поэтому я хотел бы, чтобы она была constexpr, если она была скомпилирована с std c ++ 14 или более поздней версией.Один из способов сделать это:

class Foo {
#if _cplusplus >= 201402L
    constexpr
#endif
    int baz(const Bar& bar);
};

Есть ли лучший способ выразить это, желательно без препроцессора?

1 Ответ

0 голосов
/ 17 декабря 2018

Лучший способ сделать это - использовать макросы функционального тестирования в составе SD-6 .Изменение в том, что constexpr функции-члены неявно const помечены как __cpp_constexpr со значением 201304.Так что это должен быть ваш тест:

class Foo {
#if __cpp_constexpr >= 201304L
    constexpr
#endif
    int baz(const Bar& bar);
};

Что, если вы делаете это для более чем одной функции-члена, вы, вероятно, захотите обобщить так:

#if __cpp_constexpr >= 201304L
#  define CONSTEXPR_MEM constexpr
#else
#  define CONSTEXPR_MEM
#endif

class Foo {
    CONSTEXPR_MEM int baz(const Bar& bar);
};

То, как вы представляете это ввопрос (с использованием __cplusplus) совершенно верен - преимущество макросов тестирования возможностей заключается в том, что разные компиляторы принимают различные функции на разных этапах, поэтому вы можете получить более детальный и точный тест.В дальнейшем все основные поставщики согласились с тем, что SD-6 - правильное направление, и это будет способ делать что-то в будущем.

Обратите внимание, что существует нет способ выразитьэто без препроцессора.Там нет условного constexpr.Есть только constexpr.

...