2013-05-11 74 views
2

调用以下函数extract对g ++ 4.9.0(20130421)不起作用。我得到的错误是s1不是一个常量表达式。如果i可以初始化为constexpr,那么jk也应该如此。那是错的吗?字符串文字参数不被接受到constexpr函数

#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; 
} 
+0

我75%确定这是一个编译器错误。函数调用替换应该清除任何引用绑定问题。 – aschepler 2013-05-11 00:15:22

回答

1

您的代码格式不正确。问题是,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功能可以在运行时调用:此代码会在翻译过程中(在对strmatch的调用评估中)使用运行时参数的值(array)。

+0

这真是蹩脚!我可以将strmatch的结果赋给一个constexpr整数(i),并将它用作std :: get的模板参数。我应该能够做到这一点,而不必使用命名变量。这不是功能调用替换背后的想法吗? – Sumant 2013-05-20 22:38:43

+0

函数调用替换仅仅是描述如何评估函数调用的形式。重申一下,你的函数'extract <3>'可以在运行时调用,如果允许的话,通常需要在运行时发生模板实例化。 – 2013-05-21 04:33:48

+0

对。但只要在编译时可以对提取的所有调用(在翻译单元中)进行评估,代码就可以工作,对吧? – Sumant 2013-05-23 21:12:26

相关问题