这是我想要做的简化版本.
constexpr float f(float a, float b){
constexpr float temp = a+b;
return temp*temp*temp;
}
Run Code Online (Sandbox Code Playgroud)
在我的版本中,a + b更复杂,所以我不想剪切和粘贴三次.使用3*(a + b)也不是实际功能的有效解决方案.我试图保持与语法相关的问题,而不是代数.我可以通过将+ b移动到它自己的constexpr函数来实现它,但我宁愿不用其他无用的函数来污染命名空间.
我有一个正常工作的重载函数.(例子中的f).当我将它转换为同一个东西的模板版本时,它总是通过调用T&版本来打破,而不是T*.(在示例中为t)当我创建模板函数的非const版本时,它按预期工作.(示例中为t2)VS2010和g ++ 4.6.2都会出现这种情况.促销对const规则是否不同,或者这是某种类型的错误.
#include <iostream>
using namespace std;
int f(const int&x){return 1;}
int f(const int*x){return 2;}
template <class T> int t(const T &x){return 3;}
template <class T> int t(const T *x){return 4;}
template <class T> int t2(T &x){return 5;}
template <class T> int t2(T *x){return 6;}
int main(int argc, char ** argv){
int x=0;
cout<<f(x)<<endl;
cout<<f(&x)<<endl;
cout<<t(x)<<endl;
cout<<t(&x)<<endl;
cout<<t2(x)<<endl;
cout<<t2(&x)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
1
2
3
3
5
6
Run Code Online (Sandbox Code Playgroud) 在Scheme I中递归地构建列表时,会看到分散在Internet上的两种类型的示例.append
每次迭代都附加一个新值的一个.另一个在cons
列表完成后每次迭代前置新值的另一个reverse
调用一次.
我的直觉是后者更快,但如果Scheme解释器缓存了列表指针的末尾或正在进行其他优化,那么前者将同样快速且可读性更高.如果解释器正在进行此优化,是否保证在所有解释器中都可用?