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

标签 c++ variables language-design syntactic-sugar

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/

相关文章:

c++ - 编写正则表达式模式 C++

c++ - shared_mutex 锁排序

带有额外空行的 C++ 数据文件

python - python的设计: why is assert a statement and not a function?

c++ - 为什么模板不能采用函数局部类型?

c++ - 使用整数指针将左值转换为右值

variables - 是否可以在 Makefile 中创建多行字符串变量

javascript - 发送到 JavaScript 变量的隐藏输入字段中的实时更改?

python - 如何使用函数在python中导入变量?

language-agnostic - 默认情况下,面向对象编程语言中的引用应该是不可空的吗?