相关疑难解决方法(0)

使用C++ 11 auto关键字多少钱?

我一直在使用autoC++ 11标准中提供的新关键字来处理复杂模板类型,这是我认为它的设计目标.但我也用它来做:

auto foo = std::make_shared<Foo>();
Run Code Online (Sandbox Code Playgroud)

更加怀疑的是:

auto foo = bla(); // where bla() return a shared_ptr<Foo>
Run Code Online (Sandbox Code Playgroud)

我没有看到很多关于这个话题的讨论.似乎auto可能过度使用,因为类型通常是文档和健全性检查的一种形式.您在哪里绘制使用线auto以及此新功能的推荐用例是什么?

澄清:我不是要求哲学观点; 我要求标准委员会对该关键字的预期用途,可能还有关于如何在实践中实现该预期用途的评论.

旁注:此问题已移至SE.Programmers,然后返回Stack Overflow.关于这一点的讨论可以在这个元问题中找到.

c++ types type-inference auto c++11

210
推荐指数
8
解决办法
4万
查看次数

在C++中使用auto声明变量是否存在缺点?

这似乎auto是一个相当重要的功能,在C++ 11中添加似乎遵循许多较新的语言.与像Python这样的语言一样,我没有看到任何显式变量声明(我不确定是否可以使用Python标准).

使用auto声明变量而不是显式声明它们有缺点吗?

c++ type-inference auto c++11

141
推荐指数
7
解决办法
1万
查看次数

什么时候适合在C++中使用'auto'?

我正在努力为自己提出一些一致的规则,以便何时在C++程序中使用'auto'.这是我的pro/con列表,也许你可以通过给我你的意见来帮助我.

优点:

  • 'auto'适用于避免复杂和大型模板声明(例如auto的经典用例,用于在STL容器上定义迭代变量)

  • 'auto'适用于面向未来的代码.例如,如果我有一个int数组并且我想将它更改为无符号整数,如果我在引用该数组的元素时使用'auto',则会自动更新.当然,如果我为数组使用了typedef,那也会发生.

缺点:

  • 'auto'使代码难以阅读.我不知道声明是指针还是值.我不知道它是否有构造函数和析构函数.

  • 'auto'让我很懒.我可以忘记类型,只需编写代码.但在C++中,类型对程序的语义非常重要.

你们什么时候使用Auto?你何时不喜欢使用它?

c++ design-patterns auto

11
推荐指数
0
解决办法
288
查看次数

C++ 的 auto 关键字是否有助于草率编程,或者是否有原则性的使用?

在 C++ 中,auto关键字强制编译器在编译时推断变量的类型。所以在这个例子中

#include <vector>
int main() 
{
  std::vector<int> my_vec = {1, 2, 3};
  auto my_vec_it = my_vec.begin();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器会推断出my_vec_it具有 type std::vector<int>::iterator。我知道这是因为更换autostd::vector<int>::iterator和重新编译产生完全相同的可执行文件。

我发现auto在编译器不同意我认为变量声明应该是什么的情况下很方便,我只是希望它停止抱怨以便我可以继续写作。换句话说,auto当我不太了解我正在编写的代码时,我会使用它,这似乎是一个坏习惯。如果编译器和我在变量的类型上存在分歧,这种分歧可能会渗透并在我的代码中进一步导致更复杂、根深蒂固的错误。这让我想知道auto真正的用途是什么。

auto我上面描述的使用是一种不好的编程习惯,如果是的话,它的一些更原则性的用途是什么?

c++ auto type-deduction

2
推荐指数
1
解决办法
173
查看次数

基于C++ 11范围的多图循环 - 不能返回非常量对

我似乎无法看到我在这里做错了什么,并且稍微离开了我的深度.

我所拥有的是一些包含向量和多图的数据结构.

我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,数据就会在原始数据中发生变化.原因是该列表是基于某些标准的orig的临时子集.

首先我在矢量上尝试了它,它似乎工作,这是一个工作的例子:

std::vector<std::string> strVect;
strVect.push_back("test1");
strVect.push_back("test2");
strVect.push_back("test3");
std::vector<std::string *>strpVect;
for (std::string &str : strVect)
{
    strpVect.push_back(&str);
}
Run Code Online (Sandbox Code Playgroud)

这里,strpVect中的元素指向strVect中的原始元素.

现在我想为multimaps做同样的事情:

std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (std::pair<int, std::string> &val : strMap)  // <<<<< error here
{
    strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行这个时,我得到了错误 invalid init of non-const reference of type std::pair....

如果我使它成为一个const然后它的工作原理:

std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (const std::pair<int, …
Run Code Online (Sandbox Code Playgroud)

c++ vector multimap c++11

1
推荐指数
1
解决办法
983
查看次数