在这段代码中:
for ( ;(auto i = std::find(some_string.begin(),some_string.end(),'%')) != some_string.end();)
{
}
Run Code Online (Sandbox Code Playgroud)
我从gcc 4.7.1收到错误:
error: invalid use of 'auto'|
Run Code Online (Sandbox Code Playgroud)
任何想法为什么?不应该正确编译?
我目前正在将我的代码转换为C++ 11并且在以下基于范围的for循环中遇到问题(FWIW,相同的代码在使用BOOST for_each之前运行得很好).
所述mLibraryFiles
构件(STL向量)是一个单件实例的一部分,并且保证当呼叫者检查返回的对象只包含垃圾的方法返回后存在,但是.
通过它进行调试似乎在从方法返回之后从预期内容转为垃圾,所以我想我必须对C++ 11基于范围的循环实际如何工作有所不妥:
Entry* FindEntry(string inName)
{ Entry *rs = NULL;
for (auto libraryEntry : mLibraryFiles)
{
if (libraryEntry.filename.compare(inName) == 0)
{
rs = &libraryEntry;
break;
}
}
return rs;
}
Run Code Online (Sandbox Code Playgroud)
我原以为libraryEntry
变量代表mLibraryFiles
向量中的实际对象?
任何见解都非常感谢!
(编译器是LLVM 5.0虽然我怀疑这很重要..)
我有一个功能:
template<typename T> f(T x) { do something with x; }
Run Code Online (Sandbox Code Playgroud)
我想将此自动指针传递给函数
auto x = ...
f<???>(x)
Run Code Online (Sandbox Code Playgroud)
反正我是这样做的吗?
社区!我正在尝试应用新的C++ 14功能,并在我尝试将const char []参数传递给下面给出的函数时意外遇到错误:
decltype(auto) autofunc( const auto& a)
{
cout<<"Hello World\n";
cout<<a<<endl;
}
auto lambd = [](const auto& word){ autofunc(std::forward< decltype(word) > (word));};
int main()
{
lambd("Goodbye World\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但是compilier的消息是函数试图返回一个数组(为什么会这样做?).如果我将函数的返回类型更改为void它将被编译.如果我传递另一种类型的参数(不是数组)它将被编译.数组有什么问题?
错误信息
../../untitled6/main.cpp: In instantiation of '<lambda(const auto:3&)> [with auto:3 = char [15]]':
../../untitled6/main.cpp:74:25: required from here
../../untitled6/main.cpp:68:84: error: no matching function for call to 'autofunc(const char [15])'
auto lambd = [](const auto& word){ autofunc(std::forward< decltype(word) > (word));};
^
../../untitled6/main.cpp:68:84: note: candidate is:
../../untitled6/main.cpp:60:17: …
Run Code Online (Sandbox Code Playgroud) 我知道auto
关键字的含义已完全从C++ 11中改变.但是最近我编写了一个简单的程序,在编译=std=c++98
选项时可以编译和运行.
#include <iostream>
void fun(auto int a)
{
a=3;
std::cout<<a<<'\n';
}
int main()
{
fun(3);
}
Run Code Online (Sandbox Code Playgroud)
Orwell Dev C++ IDE给出了如下警告:
[Warning] 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
Run Code Online (Sandbox Code Playgroud)
那么,auto
用于函数参数是否可以,或者我是否应该auto
像上面的程序一样使用它来保持与C++ 11的兼容性?
更新2
为什么这标记重复?Where and why do I have to put the “template” and “typename” keywords?
不回答这个问题.这里描述的行为在任何地方都没有提到(你不会找到关于auto
那里的预期行为的单一评论).
这不是重复,特别是因为在不同的编译器中存在冲突的行为.
UPDATE
就像GCC一样,clang也无法编译:
17 : error: expected expression
return p->is<true>();
^
Run Code Online (Sandbox Code Playgroud)
但是,在MSVC上,具有auto
检测的代码正在成功编译.
显然,某处存在编译器错误.
考虑以下课程:
struct A {
template<bool>
bool is() const {
return true;
}
template<bool>
static A* get() {
static A a;
return &a;
}
};
Run Code Online (Sandbox Code Playgroud)
如果是模板功能,如
template<bool cond>
bool foo() {
auto p = A::get<cond>();
return p->is<true>();
} …
Run Code Online (Sandbox Code Playgroud) 我有这个代码.
CGraphicTextInstance*& prGuildNameInstance = pTextTail->pGuildNameTextInstance;
Run Code Online (Sandbox Code Playgroud)
我想应用一些c ++ 11功能,如auto
转换.
自动后应该是这样的:
auto prGuildNameInstance = pTextTail->pGuildNameTextInstance;
Run Code Online (Sandbox Code Playgroud)
添加自动后,自动分配只是CGraphicTextInstance
没有操作员*&
我看到这与智能感知.
我的问题是为什么?我应该添加手动缺少的运营商?像这样 ?
auto &prGuildNameInstance = pTextTail->pGuildNameTextInstance;
Run Code Online (Sandbox Code Playgroud)
我的问题可以破坏我的代码吗?这可能是个问题吗?可以自动分配他想要的东西吗?
我正在按照本教程使用auto
关键字和STL迭代器.
它说这种语法适用于C++ 11.
vector<int> vec;
auto itr = vec.iterator(); // instead of vector<int>::iterator itr
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试它时,我得到这个编译错误?
错误:无效使用'std :: vector :: iterator'
我在使用auto
声明时遇到问题.我在Visual Studio 2017中编写了一个程序,如下所示:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class MyClass
{
public:
struct mystruct {
vector<int> vi;
};
vector<mystruct> TheStructV;
void AddStructV() {
TheStructV.push_back(mystruct());
};
};
int main()
{
MyClass MyObj[3];
for (int a = 0; a < 3; a++) {
MyObj[a].AddStructV();
for (int i = 1; i <= 5; i++) {
MyObj[a].TheStructV[MyObj[a].TheStructV.size() - 1].vi.push_back(i * 10 + idx);
}
idx++;
}
for (int b = 0; b<3; b++) {
cout << …
Run Code Online (Sandbox Code Playgroud) 我遇到了以下示例,其中auto声明默认为int而不是long:
#include <stdio.h>
int main(int argc, char **argv)
{
auto i = 999999999999999;
// long i = 999999999999999;
printf("i = %ld\n",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译这段代码时,gcc确实提供了一个相关的警告,i
实际上是int
:
$ gcc -o main main.c
main.c: In function ‘main’:
main.c:4:10: warning: type defaults to ‘int’ in declaration of ‘i’ [-Wimplicit-int]
auto i = 999999999999999;
^
main.c:4:14: warning: overflow in implicit constant conversion [-Woverflow]
auto i = 999999999999999;
^~~~~~~~~~~~~~~
main.c:6:19: warning: format ‘%ld’ expects argument of type ‘long int’, but …
Run Code Online (Sandbox Code Playgroud)