我可以看到为什么auto
C++ 11中的类型提高了正确性和可维护性.我读过它也可以提高性能(Herb Sutter 几乎总是自动),但我错过了一个很好的解释.
auto
提高性能?我一直在使用auto
C++ 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.关于这一点的讨论可以在这个元问题中找到.
如果您阅读的代码如下
auto&& var = foo();
where foo
是按类型值返回的任何函数T
.然后var
是左值类型的左值引用T
.但这意味着var
什么呢?这是不是意味着,我们被允许窃取资源var
?是否有任何合理的情况,您应该使用auto&&
告诉读者您的代码与您在返回时unique_ptr<>
告诉您拥有独占所有权时的行为?例如什么T&&
时候T
类型?
我只是想了解,如果有任何其他用例auto&&
比模板编程中的用例; 喜欢这篇文章中的例子中所讨论的那些通用参考斯科特迈尔斯.
这似乎auto
是一个相当重要的功能,在C++ 11中添加似乎遵循许多较新的语言.与像Python这样的语言一样,我没有看到任何显式变量声明(我不确定是否可以使用Python标准).
使用auto
声明变量而不是显式声明它们有缺点吗?
以下代码编译并运行时,我感到很惊讶(vc2012&gcc4.7.2)
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得好吗?为什么这是正确的?为什么我可以auto
在私有类型上使用,而我不能使用它的名字(如预期的那样)?
在c ++ 14 decltype(auto)
中引入了成语.
通常,它的用途是允许auto
声明使用decltype
给定表达式的规则.
搜索成语的"好"用法示例我只能想到以下内容(由Scott Meyers提供),即函数的返回类型推导:
template<typename ContainerType, typename IndexType> // C++14
decltype(auto) grab(ContainerType&& container, IndexType&& index)
{
authenticateUser();
return std::forward<ContainerType>(container)[std::forward<IndexType>(index)];
}
Run Code Online (Sandbox Code Playgroud)
这个新语言功能有用吗?
从我以前学习C++的所有材料来看,auto
一直是一个奇怪的存储持续时间说明符,它没有任何用途.但就在最近,我遇到的代码将其用作类型名称.出于好奇,我尝试了它,它假设我碰巧分配给它的类型!
突然间,STL迭代器以及使用模板的任何东西都比写入容易10倍.感觉就像我正在使用像Python这样的"有趣"语言.
这个关键词一直在哪里?你会说它是视觉工作室独有的还是不可移植的?
我有一种感觉,lambda的类型是一个函数指针.当我进行以下测试时,我发现它是错误的(演示).
#define LAMBDA [] (int i) -> long { return 0; }
int main ()
{
long (*pFptr)(int) = LAMBDA; // ok
auto pAuto = LAMBDA; // ok
assert(typeid(pFptr) == typeid(pAuto)); // assertion fails !
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是否缺少任何一点?如果不是那么,typeof
用auto
关键字推导出的lambda表达式是什么?
代码:
int main(void)
{
auto a=1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当文件具有.c扩展名时,MS Visual Studio 2012编译器会编译无错误.我一直认为,当你使用.c扩展名时,编译应该是根据C语法,而不是C++.而且,据我所知,自C++ 11以来只允许在C++中使用auto类型,这意味着该类型是从初始化程序推导出来的.
这是否意味着我的编译器不坚持C,或者C语言中的代码实际上是否正确?
考虑这个相当无用的程序:
#include <iostream>
int main(int argc, char* argv[]) {
int a = 5;
auto it = [&](auto self) {
return [&](auto b) {
std::cout << (a + b) << std::endl;
return self(self);
};
};
it(it)(4)(6)(42)(77)(999);
}
Run Code Online (Sandbox Code Playgroud)
基本上我们正在尝试制作一个返回自己的lambda.
error: function 'operator()<(lambda at lam.cpp:6:13)>' with deduced return type cannot be used before it is defined
哪个编译器是对的?是否存在静态约束违规,UB或两者都没有?
clang接受更新此轻微修改:
auto it = [&](auto& self, auto b) {
std::cout << (a + b) << std::endl;
return [&](auto p) { return …
Run Code Online (Sandbox Code Playgroud)