我现在正在学习C++,因为我需要编写一些低级程序。
当我了解到auto
关键字时,它让我想起了C#中的var
关键字。
那么,C#的var
和C++的auto
有哪些区别呢?
var i = 10; // implicitly typed
auto i = 10;
auto foo() { //deduced to be int
return 5;
}
template<typename T, typename U>
auto add(T t, U u) {
return t + u;
}
auto
比var
更为复杂。首先,auto
可能只是被推导类型的一部分;例如:std::vector<X> xs;
// Fill xs
for (auto x : xs) x.modify(); // modifies the local copy of object contained in xs
for (auto& x : xs) x.modify(); // modifies the object contained in xs
for (auto const& x : xs) x.modify(); // Error: x is const ref
其次,auto
可以用于一次声明多个对象:
int f();
int* g();
auto i = f(), *pi = g();
第三,auto
被用作函数声明中的尾随返回类型语法的一部分:
template <class T, class U>
auto add(T t, U u) -> decltype(t + u);
它还可以用于函数定义中的类型推导:
template <class T, class U>
auto add(T t, U u) { return t + u; }
第四,将来可能会开始用于声明函数模板:
void f(auto (auto::*mf)(auto));
// Same as:
template<typename T, typename U, typename V> void f(T (U::*mf)(V));
auto&&
是使用通用引用的唯一其他地方。2- auto
可以用于 lambda 表达式参数。我猜我甚至还错过了一些用法。 - Tanveer Badar它们是等效的。它们都允许您不必自己指定变量类型,但变量仍然是强类型的。下面这几行在C#中是等效的:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
以下C++代码等效:
auto i = 10;
int i = 10;
然而,需要记住的是,在C++中,auto
变量的正确类型是使用函数调用的模板参数推断规则来确定的。
auto
- 例如当您使用lambda函数时。在C#中也是如此吗?另请注意auto i = 10;
在C++11之前和之后意义非常不同(尽管在这种特定情况下,两个标准都将i
设置为int
类型)。 - Bathshebaauto
在编译时确实会解析为具体或通用类型。您可以将其替换为该具体类型。 - Panagiotis Kanavosvar
。 你必须使用适当的委托类型(可以是Action<>
或Func<>
之一)。因此实际上,就Lambda表达式而言,var
和auto
并不等价。 - Matthew Watsonauto
是不可避免的。 - Gavi Lock
var
。 - Matthew Watson