在我看来,拥有"总是返回5的功能"正在破坏或淡化"调用函数"的含义.必须有一个原因,或者需要这种能力,或者它不会出现在C++ 11中.为什么会这样?
// preprocessor.
#define MEANING_OF_LIFE 42
// constants:
const int MeaningOfLife = 42;
// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
Run Code Online (Sandbox Code Playgroud)
在我看来,如果我编写了一个返回字面值的函数,并且我进行了代码审查,有人会告诉我,我应该声明一个常量值而不是写回返5.
C++ 11编译器(以及他们)是否注意到一个函数是constexpr并且即使它们未被声明为constexpr也会将它们视为这样?
我正在使用维基百科中的示例向使用constexpr的人展示:
int get_five() {return 5;}
int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是编译器没问题.所以,我进一步更改了get_five()以获取一些int参数,将它们相乘并返回结果,同时仍未明确声明为constexpr.编译器也可以.似乎如果编译器可以做到这一点,那么为了明确声明constexpr的某些东西,没有太多的意义.
谢谢,我不需要任何书来教我什么constexpr意思.我正在教学constexpr,我的简单例子无法说服学生为什么应该利用编译时计算的优势constexpr.
还请严格避免链接到问题,比如这个它没有汇编代码或分析,他们是没有意义的,我的问题.
我正在寻找一个例子来说明为什么constexpr它有用并且不能被解雇.
好吧,在很多情况下如果constexpr被替换为const没有错,确实会发生.所以,我设计了以下示例:
main_const.cpp
#include <iostream>
using namespace std;
const int factorial(int N)
{
if(N<=1)
return 1;
else
return N*factorial(N-1);
}
int main()
{
cout<<factorial(10)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和
main_constexpr.cpp
#include <iostream>
using namespace std;
constexpr int factorial(int N)
{
if(N<=1)
return 1;
else
return N*factorial(N-1);
}
int main()
{
cout<<factorial(10)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但问题是,对于他们以前的那个,汇编代码是
main_const.asm
12:main_last.cpp **** int main()
13:main_last.cpp **** {
132 .loc …Run Code Online (Sandbox Code Playgroud)