更新:我在下面发布了我自己的答案, 这里有一个更长的版本:http: //scrupulousabstractions.tumblr.com/post/38460349771/c-11-type-safe-use-of-integer-user-defined-文字
问题:
我制作了一个简单的constexpr
用户定义文字_X
,将值作为 unsigned long long 获取(这就是数字用户定义文字的工作方式:http ://en.cppreference.com/w/cpp/language/user_literal ),然后我制作确保该值适合带符号的 long long。
这一切都很好(太大的值会导致编译错误),但只有当我明确创建一个变量时
constexpr auto a= 150_X;
相反,如果我写一些典型的东西,比如
cout << 150_X << endl;;
测试不在编译时执行。
如果将 constexpr 函数分配给 constexpr 变量,它们是否仅在编译时执行?(我在标准中找不到)
是否有可能实现
_X
我正在寻找的安全行为?
完整示例:
#include<iostream>
#include<stdexcept>
inline constexpr long long testConv(unsigned long long v) {
return (v > 100 ) ? throw std::exception() : v;
} // will eventually use actual limit from numeric_limits
inline constexpr long long operator "" _X(unsigned long long f) {
return testConv(f) ;
}
int main(){
constexpr auto a= 5_X;
std::cout << a << std::endl;
std::cout << 200_X << std::endl; // This bad literal is accepted at compile time
constexpr auto c=250_X; // This bad literal is not accepted at compile time
std::cout << c << std::endl;
}
哦,供参考:我用的是gcc4.7.2。