mypair, constructor, constexpr
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.05.15 07:16
Оценка:
привет!

есть такой код, который не хочет компиляться:
template<typename V>
struct pair {
    constexpr pair(const char *k, V &v)
        :k(k)
        ,v(v)
    {}

    const char *k;
    V &v;
};

template<typename V>
constexpr pair<V> json_pair(const char *k, V &v) {
    return pair<V>{k, v};
}

int main() {
    int i;
    constexpr auto p0 = json_pair("i", i);
}

говорит:

'pair<int>{((const char*)"i"), i}' is not a constant expression

constexpr я таки недоучил, и хз, что я делю не так...
хотя, есть подозрение, что оно и не должно работать ввиду того, что i(второй аргумент для json_pair()) — не constexpr...


спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: mypair, constructor, constexpr
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.05.15 07:19
Оценка:
хотя, constexpr auto p1 = std::make_pair("i", i); не компиляется с похожей ошибкой:

the value of 'i' is not usable in a constant expression

пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: mypair, constructor, constexpr
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.05.15 07:24
Оценка:
наверное, лучше объясню задачу.

в моей паре мне нужна возможность использовать pair::k для constexpr выражения.
pair::v же, должен быть неконстантной ссылкой.

такое возможно?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: mypair, constructor, constexpr
От: Constructor  
Дата: 07.05.15 07:44
Оценка:
Здравствуйте, niXman, Вы писали:

X>constexpr я таки недоучил, и хз, что я делю не так...

X>хотя, есть подозрение, что оно и не должно работать ввиду того, что i(второй аргумент для json_pair()) — не constexpr...

Следующий код
// ...

int i;

int main() {
    constexpr auto p0 = json_pair("i", i);
    
    (void)p0;
}

компилируется на clang 3.6.0 и g++ 4.9.2 с ключами -std=c++11 -Wall -Wextra -Werror -pedantic-errors. Догадаетесь, почему?

P.S. Писать в return statement pair<V>{k, v} явно излишне, достаточно просто {k, v}.
Отредактировано 07.05.2015 7:46 Constructor . Предыдущая версия .
Re[2]: mypair, constructor, constexpr
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.05.15 07:51
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Догадаетесь, почему?

живет дольше?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: mypair, constructor, constexpr
От: Constructor  
Дата: 07.05.15 08:12
Оценка: 9 (1) +1
Здравствуйте, niXman, Вы писали:

C>>Догадаетесь, почему?

X>живет дольше?

Достаточно очевидно, что ссылка в constexpr-объекте должна указывать на объект с static storage duration.

Стандарт C++11 (параграф 5.19, абзац 3):

A reference constant expression is an lvalue core constant expression that designates an object with static storage duration or a function.


Стандарт C++14 (параграф 5.19, абзац 4):

A constant expression is either a glvalue core constant expression whose value refers to an object with static storage duration or to a function, or a prvalue core constant expression whose value is an object where, for that object and its subobjects:
— each non-static data member of reference type refers to an object with static storage duration or to a function, and
— if the object or subobject is of pointer type, it contains the address of an object with static storage duration, the address past the end of such an object (5.7), the address of a function, or a null pointer value.

Re[4]: mypair, constructor, constexpr
От: niXman Ниоткуда https://github.com/niXman
Дата: 07.05.15 10:20
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Достаточно очевидно ... [snip]


ну хз, мне не очевидно)


в общем понял.
решил задачу по другому. вопрос закрыт.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.