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 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, 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}.
Здравствуйте, 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.