2016-11-24 155 views
8

我现在正在学习C++,因为我需要编写一些低级程序。C#“var”和C++“auto”之间的区别

当我了解到“auto”关键字时,它提醒我“来自C#的”var“关键字。

那么,C#“var”和C++“auto”有什么区别?它看起来相同,看到他们的功能...

*不完全,但我明白了!感谢您的评论,回复大家!

*我从回答中删除了我的评论,因为我看到了消息“避免消息”谢谢!'“。

*我有很多信息...非常感谢你!

+0

,它们都被用于类型推断 – UnholySheep

+0

然后,他们都是相同的技术? –

+0

这两个关键字可以达到相同的效果,只是使用不同的编程语言 – UnholySheep

回答

11

在C#中var关键字只能在本地内部功能:

var i = 10; // implicitly typed 

不仅变量,而且在功能和模板C++自动关键字can deduce类型:

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 keyword in C++ does not affect performance。和var关键字does not affect performance as well

另一个区别可能在于IDE中的intellisense支持。在C#中的Var关键字可以很容易地推导出来,并且您将看到鼠标悬停的类型。在C++中使用auto关键字可能会更复杂,这取决于IDE。

+0

那么,汽车可以用更广泛的范围? –

+0

是的,使用C++中的auto,您可以通过强类型检查来构建整个扣分链。 – qub1n

+0

'var'不会影响C#中的性能,因此链接到的示例已损坏,因为'List bar1 = Foo();'会产生编译时错误。请参阅[Servy的评论](http://stackoverflow.com/questions/356846/will-using-var-affect-performance?rq=1#comment68562462_356855) –

6

它们是等效的。它们都允许你不要自己指定变量的类型,但变量保持强类型。下面的线在C#中是相同的:

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

而下面的线是等价的C++:

auto i = 10; 
int i = 10; 

但是,你应该记住,在C++中正确类型的auto变量是使用函数调用的模板参数推导规则确定的。

+1

再加一个。请注意,在C++的某些情况下,使用'auto'是不可避免的 - 比如当你使用lambda函数时。这在C#中也是如此吗?还要注意''auto i = 10;'在C++ 11之前和之后有非常不同的含义(即使在这种特殊情况下,标准将'i'设置为'int'类型)。 – Bathsheba

+0

为什么不可避免? 'auto' *会在编译时解析为具体或泛型类型。你可以用那个具体的类型替换它 –

+0

lambda函数的具体类型是? – Bathsheba

4

简单来说,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));