我正在使用 GCC 6.3,令我惊讶的是以下代码片段确实可以编译。
auto foo(auto x) { return 2.0 * x; }
...
foo(5);
Run Code Online (Sandbox Code Playgroud)
AFAIK 它是 GCC 扩展。与以下内容进行比较:
template <typename T, typename R>
R foo(T x) { return 2.0 * x; }
Run Code Online (Sandbox Code Playgroud)
除了返回类型推导之外,上面的声明是否等效?
我希望能够使用 C++ 范围通过压缩容器而不是显式索引它们来帮助简化代码逻辑。我可以让它与详细的 lambda 参数一起使用,但我宁愿尝试使用 more 使其更简单/可概括auto
。
const int n = ...;
std::vector<float> a(n), b(n), c(n);
...initialize a and b...
// This works
ranges::for_each(
ranges::views::zip(a, b, c),
[](const std::tuple<float&, float&, float&>& v)
{
const auto& [a, b, c] = v;
c = a + b;
std::cout << typeid(v).name(); // NSt3__15tupleIJRfS1_S1_EEE
}
);
// This fails
ranges::for_each(
ranges::views::zip(a, b, c),
[](const auto& v)
{
const auto& [a, b, c] = v;
// c = a + b;
std::cout << …
Run Code Online (Sandbox Code Playgroud) 对于下面的代码,我们如何使用 std::forward 转发函数自动参数?
void push_value(std::vector<MyType>& vec, auto&& value)
{
vec.emplace_back(std::forward<?>(value));
}
Run Code Online (Sandbox Code Playgroud) 用cl.exe编译。
#include <string>
从移动serialization.cpp => database.h,它给出了一个致命的内部编译器错误C1001。数据库.h:
#pragma once
#include <map>
struct map_manip
{
void operator()(auto& map, uint8_t size = 2);
};
Run Code Online (Sandbox Code Playgroud)
数据库.cpp:
#include "database.h"
void map_manip::operator()(auto& map, uint8_t size)
{
}
Run Code Online (Sandbox Code Playgroud)
序列化.cpp:
#include "database.h"
#include <string>
struct entry
{
std::map<std::string_view, uint32_t> units;
};
int main() …
Run Code Online (Sandbox Code Playgroud) 下面的代码无法编译:
template<typename... Ts>
void CreateArr(const Ts&... args)
{
auto arr[sizeof...(args) + 1]{ args... };
}
int main()
{
CreateArr(1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
由于以下错误:
'arr'
:在直接列表初始化上下文中, for 的类型'auto [6]'
只能从单个初始化表达式推导auto [6]'
:数组的元素类型不能包含'auto'
'const int'
为'std::initializer_list<int>'
我的问题是:
为什么我不能使用auto
来定义数组的类型?
如何正确定义它以与模板一起使用?
我有这六行:
auto it = rcp_amxinfo.find(LocalPass.script);//175
if (it != rcp_amxinfo.end()) //176
{//177
if(it->second.GPSRouteCalculated.PublicFound)//178
{
...
amx_Exec(LocalPass.script, NULL, it->second.GPSRouteCalculated.POINTER);//186
Run Code Online (Sandbox Code Playgroud)
他们在VS2012中编译得很好,但是在centOS6上的GCC中我得到了这些错误:
./RouteConnector/main.cpp:175: error: ISO C++ forbids declaration of ‘it’ with no type
./RouteConnector/main.cpp:175: error: cannot convert ‘std::_Rb_tree_iterator<std::pair<AMX* const, Callbacks> >’ to ‘int’ in initialization
./RouteConnector/main.cpp:176: error: no match for ‘operator!=’ in ‘it != rcp_amxinfo.std::map<_Key, _Tp, _Compare, _Alloc>::end [with _Key = AMX*, _Tp = Callbacks, _Compare = std::less<AMX*>, _Alloc = std::allocator<std::pair<AMX* const, Callbacks> >]()’
./RouteConnector/main.cpp:178: error: base operand of ‘->’ is not a pointer …
Run Code Online (Sandbox Code Playgroud) 如果您正在循环通过容器:
typedef std::vector<std::unique_ptr<BaseClass>> Container;
Container container;
for(Container::const_iterator element = container.begin(); element != container.end(); element++)
{
//Read through values
}
Run Code Online (Sandbox Code Playgroud)
而不是使用typedef你决定使用auto:
std::vector<std::unique_ptr<BaseClass>> container;
for(auto element = container.begin(); element != container.end(); element++)
{
//Read through values
}
Run Code Online (Sandbox Code Playgroud)
假设你不改变这些值,auto关键字是否使用const迭代器而非const const?
这个问题最重要的是好奇心,我唯一可以看到这是现实生活场景中适用的问题的唯一原因是,如果你需要传达的话,那就是你不要将价值观改变为另一个从事代码工作的人.
我可以轻松地声明匿名函数(它们与lambda相同,但没有"context" - [...]
)auto
:
#include <iostream>
using namespace ::std;
void foo(void (*f)(char))
{
f('r');
}
int main()
{
void (*anon)(char) = [](char c) -> void { cout << c << endl; };
foo(anon);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是如何宣布lambda?这是唯一可能的方式吗?(也许使用typedef).我在这里使用::std::function
,但我没有在foo参数中提到f的上下文...:
#include <iostream>
#include <functional>
using namespace ::std;
//int foo(auto f, char x) // !only since c++14
int foo(function<int(char)> f, char x)
{
return f(x+1);
}
int main()
{
int a = 5, b = 10;
//void (*lambda)(char) …
Run Code Online (Sandbox Code Playgroud) 我进入C++ 11并且真的无法理解为什么会发生这种情况:
const int arrSource[4] = { 5,7,6,4 };
for (auto& i : arrSource) {
std::cout << i << " ";
++i; //error
}
Run Code Online (Sandbox Code Playgroud)
它说i
必须是一个可修改的左值,并且i
:你不能分配给一个变量const
.
所以它意味着,如果arrSource[]
是const
,它i
const
也是如此?
int i = 0;
Run Code Online (Sandbox Code Playgroud)
相当于
int i;
i = 0;
Run Code Online (Sandbox Code Playgroud)
然后,
auto i = 0;
Run Code Online (Sandbox Code Playgroud)
没关系,工作正常.但,
auto i;
i = 0;
Run Code Online (Sandbox Code Playgroud)
编译器给出错误.
那么,为什么编译器会出错?