标签: auto

将函数参数类型声明为 auto

我正在使用 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++ gcc auto

3
推荐指数
1
解决办法
1893
查看次数

具有自动和结构化装订功能的 V3 zip 系列

我希望能够使用 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)

c++ tuples auto c++17 structured-bindings

3
推荐指数
1
解决办法
944
查看次数

完美转发 auto 类型的值

对于下面的代码,我们如何使用 std::forward 转发函数自动参数?

void push_value(std::vector<MyType>& vec, auto&& value)
{
    vec.emplace_back(std::forward<?>(value));
}
Run Code Online (Sandbox Code Playgroud)

c++ parameters function forward auto

3
推荐指数
1
解决办法
396
查看次数

C++17、LNK2019、C1001 中的 C++14 错误

有一个非常简单的 3 文件源。

cl.exe编译。

  • 使用/std:c++17编译时会出现c++14错误(错误 C3533:参数不能具有包含 'auto' 的类型)。
  • 使用/std:c++20它编译但给出一个LNK2019
  • 当使用/ STD:C ++ 20但随着 #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)

c++ auto cl c++14 c++17

3
推荐指数
1
解决办法
66
查看次数

为什么在模板函数中不允许使用 auto 来创建内置数组?

下面的代码无法编译:

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来定义数组的类型?

  • 如何正确定义它以与模板一起使用?

c++ templates auto c++11 c++17

3
推荐指数
1
解决办法
290
查看次数

ISO C++禁止声明'it'没有自动迭代器的类型?

我有这六行:

    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)

c++ iterator compiler-errors auto

2
推荐指数
1
解决办法
4175
查看次数

'auto'关键字是否知道何时使用const迭代器?

如果您正在循环通过容器:

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?

这个问题最重要的是好奇心,我唯一可以看到这是现实生活场景中适用的问题的唯一原因是,如果你需要传达的话,那就是你不要将价值观改变为另一个从事代码工作的人.

c++ loops vector auto c++11

2
推荐指数
1
解决办法
1477
查看次数

如何用函数指针声明lambda(没有auto)?

我可以轻松地声明匿名函数(它们与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++ lambda pointers anonymous-function auto

2
推荐指数
1
解决办法
499
查看次数

const数组的自动引用

我进入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也是如此?

c++ reference auto c++11

2
推荐指数
1
解决办法
488
查看次数

关于'自动'演绎类型的困惑

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)

编译器给出错误.

那么,为什么编译器会出错?

c++ types auto c++11

2
推荐指数
1
解决办法
449
查看次数