说实话我找到了less如果变量是其中之一,则令人困惑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 这个问题通常只是因为函数太少而代码太多。然后它不仅适用于常量,还适用于类似的特征 - 比如引用所指的内容。
一个经典的方法是使用多个可能的流之一。而不是这个
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);
}
我还没有看到一个现实世界中的变量的例子,它不像它应该的那样恒定,并且无法通过分离关注点来修复。