Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc constexpr函数不接受字符串文字参数_Gcc_C++11_G++_Constexpr - Fatal编程技术网

Gcc constexpr函数不接受字符串文字参数

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

在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 = 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
函数,则需要生成代码)。