2016-12-17 2 views
4

Я хотел инициализировать переменную-член constexpr с помощью функции-члена constexpr, но она не скомпилировалась. Это было нормально, когда я переместил функцию из класса. Почему это происходит? Есть ли способ использовать функции-члены класса constexpr для инициализации переменных-членов constexpr?Инициализация переменной constexpr с помощью функции constexpr member

Я использую Apple LLVM версии 8.0.0 (clang-800.0.38).

Спасибо за любую помощь.

constexpr static int Add_Ext(int a, int b) { return a + b; } 


class Foo 
{ 
public: 
    constexpr static int Add_InClass(int a, int b) { return a + b; } 

    // This is OK. 
    constexpr static int kConstantX = Add_Ext(1, 2); 

    // This results in a compile error. 
    constexpr static int kConstantY = Add_InClass(1, 2); 

}; 

лязг сообщение об ошибке:

Constexpr variable 'kConstantY' must be initialized by a constant expression 
+0

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1626 – Danh

ответ

0

От CWG-1255 и CWG-1626

Стандарт должен четко указать, что функция constexpr член не может быть использован в постоянном выражении, пока его класс не является полным ,

Похоже, что ваш код намеренно неприемлем. Тем не менее, стандарт должен сделать его более ясным в этом вопросе.

Есть ли способ использовать функции-члены класса constexpr для инициализации переменных-членов constexpr?

w.r.t. эти DR, Нет. Вместо этого вы можете переместить его на улицу или в другой класс.

+0

Ах, все в порядке. Благодаря! – Poinsettia

0

Благодаря Danh. Я заглянул в поток WG, который вы сказали, и в конце концов я обнаружил, что могу использовать функции-члены constexpr, если я создаю шаблон класса.

// This works (it doesn't if you make it as a non-template class). 
template <typename T> 
class TemplateFoo 
{ 
public: 
    constexpr static T Add_InClass(T a, T b) { return a + b; } 
    constexpr static T kConstantY = Add_InClass(1, 2); 

}; 

// Even such a meaningless template works too. 
template <typename T> 
class TemplateBar 
{ 
public: 
    constexpr static int Add_InClass(int a, int b) { return a + b; } 
    constexpr static int kConstantY = Add_InClass(1, 2); 

}; 

// So, this would be a (dirty but) useful workaround 
// when you don't want to use the class as a template. 
// Any type could be used as the template argument, which has no meaning. 
using Bar = TemplateBar<char>; 
+0

Помните, что при фиксированном DR. Шаблон также будет запрещен – Danh

+0

Действительно ... Тогда это обходное решение не очень хорошо. – Poinsettia

Смежные вопросы