鉴于我的变量是一个指针,如果我将它分配给"auto"类型的变量,我是否指定"*"?
std::vector<MyClass> *getVector(); //returns populated vector
//...
std::vector<MyClass> *myvector = getVector(); //assume has n items in it
auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;
//goal is to behave like this assignment:
std::vector<MyClass> *newvar3 = getVector();
Run Code Online (Sandbox Code Playgroud)
我对auto
c ++ 11的工作方式有点困惑(这是c ++ 11的新功能,对吧?)
更新:我修改了上面的内容,以更好地阐明我的向量是如何在函数中填充的,我只是尝试将返回的指针赋给变量.对困惑感到抱歉
我目前正在阅读“专家 C 编程 - 深层 C 秘密”,刚刚发现了这个:
\n\n\n\n
auto
永远不需要存储类说明符。这对于编译器编写者来说最有意义\n在符号表 \xe2\x80\x94 中创建一个条目,它表示“此存储在进入\n块时自动分配”(而不是在编译时静态分配,或在编译时动态分配)堆)。auto
\n对于所有其他程序员来说几乎没有意义,因为它只能在函数内部使用,但是\n函数中的数据声明默认具有此属性。
我看到有人在这里问了同样的事情,但他们没有任何答案,评论中给出的链接仅解释了为什么 C 中有这样一个继承自B 的关键字,以及与 C++ 的差异11 或 C++11 之前版本。
\n无论如何,我发布的内容是为了重点说明auto
关键字在编译器编写中以某种方式有用的部分,但是这个想法是什么以及与符号表的联系是什么?
我确实坚持这样一个事实:我只询问用 C 语言编写编译器时的潜在用法(而不是编写 C 编译器)。
\n为了澄清这一点,我问这个问题是因为我想知道是否有一个auto
可以证明合理的代码示例,因为作者在编写编译器时表示会有。
这里的重点是我认为已经理解了auto
(继承自B,它是强制性的,但在C中无用),但我无法想象使用它时的任何示例是有用的(或者至少不是无用的)。
看起来确实没有任何理由使用auto
,但是是否有任何旧的源代码或类似的内容与引用的语句相对应?
#include <vector>
#include <algorithm>
void foo( int )
{
}
int main()
{
std::vector< int > v( { 1,2,3 } );
std::for_each( v.begin(), v.end(), []( auto it ) { foo( it+5 ); } );
}
Run Code Online (Sandbox Code Playgroud)
编译时,上面的示例启动错误输出,如下所示:
h4.cpp: In function 'int main()':
h4.cpp:13:47: error: parameter declared 'auto'
h4.cpp: In lambda function:
h4.cpp:13:59: error: 'it' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
这是否意味着auto
不应在lambda表达式中使用关键字?
这有效:
std::for_each( v.begin(), v.end(), []( int it ) { foo( it+5 ); } );
Run Code Online (Sandbox Code Playgroud)
为什么带有auto关键字的版本不起作用?
这是来自Scott Meyers的C++ 11 Notes Sample的代码,
int x;
auto&& a1 = x; // x is lvalue, so type of a1 is int&
auto&& a2 = std::move(x); // std::move(x) is rvalue, so type of a2 is int&&
Run Code Online (Sandbox Code Playgroud)
我理解困难auto&&
.
我有一定的了解auto
,从中我会说,auto& a1 = x
应该使类型a1
为int&
哪个来自引用代码,似乎有误.
我写了这个小代码,并在gcc下运行.
#include <iostream>
using namespace std;
int main()
{
int x = 4;
auto& a1 = x; //line 8
cout << a1 << endl;
++a1;
cout << x;
return 0; …
Run Code Online (Sandbox Code Playgroud) 今天我发现了这段代码
#include <cstdio>
auto terminal = [](auto term)
{
return [=] (auto func)
{
return terminal(func(term));
};
};
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,GCC接受了它.Clang拒绝它,因为它terminal
在自己的初始化器中使用并被声明auto
.
我期待clang给出的错误,但它实际上是不正确的吗?或者必须接受代码?
有没有办法将auto作为参数传递给另一个函数?
int function(auto data)
{
//DOES something
}
Run Code Online (Sandbox Code Playgroud) 在这段代码中:
struct
{
auto operator[](const char*)
{
return *this;
}
} m_some_class;
Run Code Online (Sandbox Code Playgroud)
这里的类型是什么auto
?
是
auto x = initializer;
Run Code Online (Sandbox Code Playgroud)
相当于
decltype(initializer) x = initializer;
Run Code Online (Sandbox Code Playgroud)
要么
decltype((initializer)) x = initializer;
Run Code Online (Sandbox Code Playgroud)
还是两个?
我收到以下代码的警告签名/未签名不匹配:
auto n = a.size();
for (auto i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
问题是通过为i
它分配0 int
而不是size_t
.那么更好的是:
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
或这个:
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}
Run Code Online (Sandbox Code Playgroud)
或者你有更好的解决方案?我更喜欢第一个,因为它更加一致,它只是使用size_t
而不是两个size_t
并且auto
用于相同的目的.
请考虑以下代码段:
struct A
{
auto foo(), bar();
};
auto A::foo() { return 1; }
auto A::bar() { return 'a'; }
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
它在Clang ++ 3.7.0中编译得很好.
它在G ++ 5.2.0中失败:
main.cpp: In member function 'auto A::bar()':
main.cpp:7:24: error: inconsistent deduction for 'auto': 'int' and then 'char'
auto A::bar() { return 'a'; }
Run Code Online (Sandbox Code Playgroud)
自动返回类型推导是否强制在单个语句中声明的多个函数具有相同的返回类型?