Gcc constexpr函数不接受字符串文字参数
在g++4.9.0(20130421)上,调用下面的Gcc constexpr函数不接受字符串文字参数,gcc,c++11,g++,constexpr,Gcc,C++11,G++,Constexpr,在g++4.9.0(20130421)上,调用下面的extract函数对我不起作用。我得到的错误是s1不是一个常量表达式。如果i可以初始化为constexpr,那么j和k也应该初始化。这不对吗 #include <tuple> template <unsigned N1, unsigned N2> constexpr bool strmatch(const char (&s1)[N1], const char (&s2)[N2], unsigned i
extract
函数对我不起作用。我得到的错误是s1
不是一个常量表达式。如果i
可以初始化为constexpr,那么j
和k
也应该初始化。这不对吗
#include <tuple>
template <unsigned N1, unsigned N2>
constexpr bool strmatch(const char (&s1)[N1], const char (&s2)[N2], unsigned i = 0)
{
return (s1[i]==s2[i]) ?
(s1[i]=='\0') ?
true
: strmatch(s1, s2, i+1)
: false;
}
template<unsigned N>
constexpr int extract(const std::tuple<int, int> & t1, const char (&array)[N]) {
return std::get<strmatch(array, "m0")>(t1);
}
int main(void)
{
constexpr int i = strmatch("m0", "m0"); // OK
constexpr int j = extract(std::make_tuple(10, 20), "m0");
constexpr int k = extract(std::make_tuple(10, 20), "m1");
return 0;
}
#包括
模板
constexpr bool stratch(const char(&s1)[N1],const char(&s2)[N2],无符号i=0)
{
返回(s1[i]==s2[i])?
(s1[i]=='\0')?
真的
:标准格式(s1、s2、i+1)
:假;
}
模板
constexpr int extract(const std::tuple&t1、const char和array)[N]){
返回std::get(t1);
}
内部主(空)
{
constexpr int i=stratch(“m0”,“m0”);//确定
constexpr int j=extract(std::make_tuple(10,20),“m0”);
constexpr int k=extract(std::make_tuple(10,20),“m1”);
返回0;
}
您的代码格式不正确。问题在于,array
不是核心常量表达式,因此不能在调用std::get
:
template<unsigned N>
constexpr int extract(const std::tuple<int, int> & t1, const char (&array)[N]) {
return std::get<strmatch(array, "m0")>(t1);
}
模板
constexpr int extract(const std::tuple&t1、const char和array)[N]){
返回std::get(t1);
}
请记住,可以在运行时调用
constepr
函数:在转换过程中(在对stratch
调用的求值过程中),此代码将使用此函数的运行时参数值(array
)。我75%确定这是一个编译器错误。函数调用替换应该可以解决任何引用绑定问题。这太差劲了!我可以将strmatch的结果分配给constexpr整数(I),并将其用作std::get的模板参数。我应该能够做到这一点,而不必使用命名变量。这不是函数调用替换背后的想法吗?函数调用替换只是描述函数调用如何计算的一种形式主义。重申一下,可以在运行时调用函数extract
,如果允许的话,通常需要在运行时进行模板实例化。对。但是,只要提取的所有调用(在翻译单元中)都可以在编译时进行计算,代码就应该可以工作,对吗?不,函数必须在运行时仍然可以工作,即使您从未以这种方式调用它constexpr
与模板实例化不同——它不允许您生成代码(如果您可以在模板参数中使用参数来constexpr
函数,则需要生成代码)。