2016-09-30 59 views
1

这是一个C++编程代码,用于显示数组1和数组2的值,但我得到的编译时错误为'需要常量表达式'。请帮助“常量表达式必需”错误,同时保持形式参数为常量

void display(const int const1 = 5) 
{ 
    const int const2 = 5; 
    int array1[const1]; 
    int array2[const2]; 

    for(int i = 1 ; i < 5 ; i++) 
    { 
     array1[i] = i; 
     array2[i] = i * 10; 

     std::cout << array1[i] << std::endl; 
    } 
} 

void main() 
{ 
    display(5); 
} 
+3

这几乎是一样的: http://stackoverflow.com/questions/18996258/array-initialization-use-const-variable-in-c – NathanOliver

+2

发布有关构建错误的问题时,请始终包含完整和未经编辑的完整错误输出。请修改您的问题以包含该问题。 –

+1

但是,请注意,C++不支持[可变长度数组](https://en.wikipedia.org/wiki/Variable-length_array),并且'const1'不是编译时常量。 –

回答

0

在C++中,const并不总是constexpr。在那些日子里,constexpr不存在,所以编译时间不变的唯一方法是使用const和文字,或者使用enum,因为编译器很容易检查这些值。

然而,在C++ 11,我们添加constexpr,该担保一个constexpr变量具有constexpr函数可以AAT评估编译时间,如果所有参数都是constexpr太可在编译时的值,并且状态。

在你的代码,你可以写你的变量const2这样的:

void display(const int const1=5) 
{ 
    constexpr int const2 = 5; 

    // ... 
} 

现在你的代码是更富于表现力你在做什么。而不是依靠const在编译时可用,你说“这个变量在编译时已知值,这是值”。

但是,如果您尝试更改const1,则会出现错误。参数,即使默认值始终为运行时已知的值。如果该值仅在运行时已知,则不能在模板参数或数组大小中使用该值。

如果您希望函数能够将receive的值const1作为一个常量表达式,因为您可以将其作为模板参数接收,因为模板参数在编译时总是已知的。

template<int const1 = 5> 
void display() 
{ 
    constexpr int const2 = 5; 

    int array1[const1]; 
    int array2[const2]; 
} 

你将不得不调用函数那样:

// const1 is 5 
display(); 

// const1 is 10 
display<10>(); 

如果您想了解更多关于模板,再去检查Function templates,或该tutorial

+0

可以'显示<10>();'更改** const1 **?的值,因为它是一个常量并可能显示错误。 @GuillaumeRacicot –

+0

不是。你可以在函数显示<10>内看到*,const1的值是10 *。对于整型值,除了需要在编译时知道它们之外,模板参数的工作方式与普通参数类似。如果你的意思是*“将const1'的''里面显示<10>'值将是10?” *,则amswer是肯定的,你发送的值确实是10 –

+0

你看,一个模板将不与单一功能一个'const1'里面。每个'显示<1>()''显示<2>()''显示<3>()'有不同的功能,因为它是一个模板。编译器会根据你的模板创建一堆不同的函数,每个函数都带有'const1',每个函数都有不同的值。 –

相关问题