gpt4 book ai didi

c++ - 在 C++ 中进行 'constify' 操作有意义吗?

转载 作者:可可西里 更新时间:2023-11-01 18:40:09 29 4
gpt4 key购买 nike

C/C++ 中使用“constify”操作使变量成为 const 是否有意义?

这是一个可能有用的例子,显然我们不想在第一行声明它 const:

std::vector<int> v;
v.push_back(5);
constify v; // now it's const

目前,如果没有这种可能性,您必须引入另一个变量才能获得相同的效果:

std::vector<int> v0;
v0.push_back(5);
const std::vector<int>& v = v0;

这更令人困惑,因为它在作用域中添加了一个新名称,您需要将其设为引用以避免复制整个 vector (或使用 swap?)。

最佳答案

坦率地说,我发现如果一个变量是 const 或不是 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();

注意 &。复制函数调用的结果没有意义,因为将右值绑定(bind)到 const 引用会延长其生命周期,直到引用的生命周期结束。
当然,使用支持 C++1x 移动语义的编译器重新编译将使此类优化变得几乎没有必要。但是将 rvlaue 绑定(bind)到 const 引用可能仍然比移动 vector 更快,而且不太可能更慢。
使用 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);
}

我还没有看到一个真实世界的变量示例,该变量不像它本来应该的那样恒定,并且无法通过分离关注点来修复。

关于c++ - 在 C++ 中进行 'constify' 操作有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568166/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com