标签: auto

SFINAE和decltype(自动)

如果函数模板返回decltype(auto)(或使用其他类型说明符auto)但返回语句格式不正确,SFINAE会导致吗?return声明是否被认为是函数签名的直接上下文?

N3690草案中的任何内容似乎都不需要这样.默认情况下,我猜SFINAE不适用.

这看起来很不幸,因为你可以编写一个函数来转发给另一个函数,但是当你写一个longhand时,你不能让它的存在以委托为条件.此外,decltype(auto)由于this不能在函数签名中使用,因此无法检查是否存在对等非静态成员函数.然而,这表明存在一个基本问题,因为decltype(auto)它提供了一种在成员签名中将类类型视为完整的路径,而不是.

是否已撰写提案,或者是否已在任何地方对问题进行了正式分析?

在成员签名中将类类型视为完整的能力可能具有其他含义......但这只是另一个问题的素材.

c++ decltype auto c++14

18
推荐指数
1
解决办法
1067
查看次数

C++20 中概念化的“operator auto”

从 C++20 开始,我们可以在auto关键字前面加上概念的名称来限制可能的类型。特别是这种组合在类转换中是可能的operator auto,例如

template <typename T> concept x = true;

struct S
{
    operator x auto() { return 2; }
    operator auto() { return 1; }
};

int main() { return S{}.operator x auto(); }
Run Code Online (Sandbox Code Playgroud)

但是 Clang 是唯一接受整个程序的编译器,但是main()返回1(而不是2我预期的那样),演示:https : //gcc.godbolt.org/z/b16jYGa81

GCC 接受结构体定义,但拒绝编译S{}.operator x auto().

即使struct S出现错误,MSVC 也拒绝接受:

error C2535: 'S::operator auto(void)': member function already defined or declared
Run Code Online (Sandbox Code Playgroud)

只是想知道,哪个编译器就在这里(如果有的话)?

c++ auto c++-concepts c++20

18
推荐指数
1
解决办法
612
查看次数

使用auto公开私有类型:哪里有用?

在这个问题中讨论了为什么暴露私有类型auto:

#include <iostream>

using namespace std;

class Base {

  class PrivateClass {    
  public: 
    void bar() { cout << "PrivateClass" << endl; }
  };

public:

  PrivateClass foo() {
    PrivateClass a;
    return a;
  }

};

int main() {

  Base b;
  auto p = b.foo();
  p.bar();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++ 11标准完全没问题.我还没有得到的是这个成语在实际应用中如何有用. 是否有问题可以有效地使用这个成语,或者它应该被视为关键词的"好奇"副作用?

c++ auto c++11

17
推荐指数
1
解决办法
368
查看次数

如何使用auto声明数组

我一直在玩,auto我注意到在大多数情况下你可以用一个变量定义替换auto,然后分配类型.

在下面的代码wx都相等(默认情况下初始化int,还是让我们无法进入潜在副本).有没有办法声明z它具有相同的类型y

int w{};
auto x = int{};
int y[5];
auto z = int[5];
Run Code Online (Sandbox Code Playgroud)

c++ auto c++11

17
推荐指数
2
解决办法
2万
查看次数

std::pair&lt;auto, auto&gt; 返回类型

我在玩autoin std::pair。在下面的代码中,函数f应该返回std::pair依赖于模板参数的类型。

一个工作示例:

例 1

template <unsigned S>
auto f()
{
    if constexpr (S == 1)
        return std::pair{1, 2}; // pair of ints
    else if constexpr (S == 2)
        return std::pair{1.0, 2.0}; // pair of doubles
    else
        return std::pair{0.0f, 0.0f}; // pair of floats
}
Run Code Online (Sandbox Code Playgroud)

这适用于 gcc 9.2、gcc 10.0、clang 9.0 和 clang 10.0。

接下来,std::pair为了清楚起见,我想明确地将返回类型写为 a :

例2

template <unsigned S>
std::pair<auto, auto> f()
{
    if constexpr (S == 1)
        return {1, …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr auto std-pair c++17

17
推荐指数
1
解决办法
1715
查看次数

与foreach在地图上的意外副本

我试图循环地图的条目,我得到意想不到的副本.这是程序:

#include <iostream>
#include <map>
#include <string>

struct X
{
    X()
    {
        std::cout << "default constructor\n";
    }

    X(const X&)
    {
        std::cout << "copy constructor\n";
    }
};

int main()
{
    std::map<int, X> numbers = {{1, X()}, {2, X()}, {3, X()}};
    std::cout << "STARTING LOOP\n";
    for (const std::pair<int, X>& p : numbers)
    {
    }
    std::cout << "ENDING LOOP\n";
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

default constructor
copy constructor
default constructor
copy constructor
default constructor
copy constructor
copy constructor
copy constructor
copy constructor
STARTING LOOP
copy constructor …
Run Code Online (Sandbox Code Playgroud)

c++ foreach map auto c++11

16
推荐指数
2
解决办法
1069
查看次数

C++ 14会支持无约束的泛型函数吗?

在注视GCC 4.9.0版本改变了这里,我惊喜地阅读以下; 在C++的"新语言和语言特定改进"部分下:

G ++支持N3889的§4.1.2和§5.1.1:Concepts Lite Specification所规定的无约束泛型函数.简而言之,auto可以用作任何函数声明符的参数声明中的类型说明符,以便引入隐式函数模板参数,类似于通用lambdas.

// the following two function declarations are equivalent
auto incr(auto x) { return x++; }
template <typename T>
auto incr(T x) { return x++; }
Run Code Online (Sandbox Code Playgroud)

我构建了GCC 4.9.0,我的初始测试按预期工作.我相信Concepts Lite将继续以某种方式辅助即将推出的C++ 14规范.是否有任何"无约束通用函数"计划成为C++的一部分?

c++ generics auto c++-concepts c++14

16
推荐指数
1
解决办法
503
查看次数

可以将变量重新声明为推导为相同类型的auto吗?

标准是否允许以下​​内容?

#include <iostream>

extern int a;
auto a = 3;

int main(int, char**)
{
    std::cout << a << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang接受代码. g ++抱怨声明冲突.

c++ extern language-lawyer auto c++11

16
推荐指数
1
解决办法
424
查看次数

c ++ 0x中auto和decltype之间的区别

我遇到auto和decltype问题.

void f(const vector<int>& a, vector<float>& b)
{
    typedef decltype(a[0]*b[0]) Tmp;
    for (int i=0; i < b.size(); ++i) {
      auto p0 = new auto(a[i]*b[i]);
      auto p1 = new decltype(a[i]*b[i]);
      *p0=a[i]*b[i];
      *p1=a[i]*b[i];
      cout<<*p0<<endl;
      cout<<*p1<<endl;
      delete p0;
      delete p1;
   }
}

 int main()
{

    vector<float>vec2;
    vec2.push_back(2.0);

    vector<int>vec1;
    vec1.push_back(5);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在GCC4.7中运行良好.我可以使用'new auto(a [0]*b [0])'为[0]*b [0]的类型分配内存吗?在这种情况下,我无法区分decltype和auto之间的区别.

c++ decltype auto c++11

15
推荐指数
1
解决办法
580
查看次数

是否可以拥有"自动"成员变量?

例如,我想要一个类型的变量,auto因为我不确定它将是什么类型.

当我尝试在类/结构声明中声明它时,它给了我这个错误:

无法推断自动类型.需要初始化程序

有办法解决吗?

struct Timer {

    auto start;

};
Run Code Online (Sandbox Code Playgroud)

c++ struct auto

15
推荐指数
3
解决办法
2万
查看次数