创建局部变量时,使用(const) auto&
或是正确的auto
吗?
例如:
SomeClass object;
const auto result = object.SomeMethod();
Run Code Online (Sandbox Code Playgroud)
要么 const auto& result = object.SomeMethod();
SomeMethod()返回非原始值 - 可能是另一个用户定义的类型.我的理解是const auto& result
正确的,因为SomeMethod()返回的结果将为返回的类型调用复制构造函数.如果我错了,请纠正我.
原始类型怎么样?我认为const auto sum = 1 + 2;
是正确的.
这是否也适用于基于范围的循环?
for(const auto& object : objects)
Run Code Online (Sandbox Code Playgroud) 我喜欢auto
C++ 11.太棒了.但它有一个不一致,真的让我紧张,因为我一直绊倒它:
int i = 3; // i is an int with value 3
int i = int{3}; // i is an int with value 3
int i(3); // i is an int with value 3 (possibly narrowing, not in this case)
int i{3}; // i is an int with value 3
auto i = 3; // i is an int with value 3
auto i = int{3}; // i is an int with value 3
auto i(3); …
Run Code Online (Sandbox Code Playgroud) 考虑以下程序:
extern int x;
auto x = 42;
int main() { }
Run Code Online (Sandbox Code Playgroud)
Clang 3.5接受它(现场演示),GCC 4.9和VS2013不接受(前者的现场演示).谁是对的,C++标准中指定的正确行为在哪里?
在C++ 11中,我可以迭代一些容器,如下所示:
for(auto i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但我知道这是不必要的 - 不必要的,因为我只需要打印 -的值vec
- 制作(编辑:每个元素)的副本vec
,所以我可以这样做:
for(auto &i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是我想确保它们的值vec
永远不会被修改并遵守const-correctness,所以我可以这样做:
for(const auto &i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如果我只需要查看某个容器的值,那么最后的循环(const auto &i
)是否总是首选,因为没有额外副本(编辑:每个元素)的效率提高vec
?
我正在开发一个我正在开发的程序,我正在考虑在整个过程中进行这种改变,因为效率是至关重要的(我在第一时间使用C++的原因).
第一个问题:是否有可能"强迫" const_iterator
使用汽车?例如:
map<int> usa;
//...init usa
auto city_it = usa.find("New York");
Run Code Online (Sandbox Code Playgroud)
我只是想查询的不是改变的任何东西指出,city_it
,所以我想有city_it
是map<int>::const_iterator
.但是通过使用auto,city_it
返回类型是相同的map::find()
,也就是说map<int>::iterator
.有什么建议吗?
bar1
和和的类型有什么区别bar2
?
int foo = 10;
auto bar1 = &foo;
auto *bar2 = &foo;
Run Code Online (Sandbox Code Playgroud)
如果这两个bar1
和bar2
是int*
,确实是有意义的写指针声明符(*
)在bar2
声明?
auto
在(可能)用C++ 17引入的模板参数中有哪些优点?
它只是auto
我想要实例化模板代码的自然扩展吗?
auto v1 = constant<5>; // v1 == 5, decltype(v1) is int
auto v2 = constant<true>; // v2 == true, decltype(v2) is bool
auto v3 = constant<'a'>; // v3 == 'a', decltype(v3) is char
Run Code Online (Sandbox Code Playgroud)
我还从这个语言功能中获得了什么?
如果在声明中初始化了非静态数据成员,它们是否允许将非静态数据成员声明为"auto"?例如:
struct S
{
auto x = 5; // in place of 'int x = 5;', which is definitely allowed
};
Run Code Online (Sandbox Code Playgroud)
GCC 4.7拒绝上述代码,但它接受了int x = 5;
.
假设这不是编译器错误,而是标准真的不允许它,为什么不呢?它与声明局部变量一样有用auto
.
当我auto
用来推断指针类型时,我发现了一个奇怪的现象.我的代码是这样的:
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译和执行之后,我们可以发现结果*p1
和*p2
是相同的,都是100.这意味着p1
并且p2
都是指向对象的指针int
对象.
[user@host ~]$ ./test
100 100
Run Code Online (Sandbox Code Playgroud)
有没有哪个定义这两个语句之间有什么区别p1
和p2
?