坦率地说,如果一个变量是不是,我发现它比如果它可以改变更容易混淆。const
详细说明一下:您通常想要这样做的原因是因为您无法const
以您想要的方式初始化变量。std::vector
就是一个很好的例子。好吧,这一次,下一个标准引入了一种通用的初始化语法,使这成为可能:
const std::vector<int> cvi = { 1, 2, 3, 4, 5, 42 };
然而,即使手头没有 C++1x 的东西,甚至使用不允许这种初始化语法的类型,你也总是可以创建一个辅助函数来做你想做的事:
const std::vector<int>& cvi = create_my_vector();
或者,如果你想变得花哨:
const std::vector<int>& cvi = compile_time_list<1,2,3,4,5,42>::create_vector();
注意&
. 复制函数调用的结果是没有意义的,因为将右值绑定到const
引用会延长它的生命周期,直到引用的生命周期结束。
当然,使用支持 C++1x 移动语义的编译器重新编译将使此类优化变得非常不必要。但是将 rvlaue 绑定到const
引用可能仍然比移动向量更快,并且不太可能更慢。
使用 C++1x,您还可以创建 lambda 函数来执行此操作。C++ 只是提供了令人难以置信的庞大工具库。IME,不管你怎么想,其他人应该想出另一个想法来做同样的事情。而且通常比你的更好。
然而,IME 这个问题通常只是在太少的函数中出现太多的代码。然后它不仅适用于 constness,还适用于类似的特征——比如引用所指的内容。
一个经典是使用几个可能的流中的一个。而不是这个
int main(int argc, char* argv[])
{
std::istream* istrm = NULL;
std::ifstream ifs;
if( argc > 1 )
{
ifs.open( argv[1] );
if( ifs.good() )
istrm = &ifs;
}
if( !istrm )
istrm = &std::cin;
while( istrm->good() )
{
// reading from *istrm implemented here
}
return 0;
}
只需将关注点分为 1) 确定从何处读取和 2) 实际读取:
int read(std::istream& is)
{
while( is.good() )
{
// reading from is implemented here
}
return 0;
}
int main(int argc, char* argv[])
{
if( argc > 1 )
{
std::ifstream ifs( argv[1] );
if( ifs.good() )
return read(ifs);
}
return read(std::cin);
}
我还没有看到一个真实世界的变量示例,它不像它本来可以的那样恒定,并且无法通过分离关注点来修复。