草庐IT

decltype-auto

全部标签

c++ - 为什么在使用结构化绑定(bind)时 auto 似乎会推断出引用?

考虑以下使用来自C++17的结构化绑定(bind)的代码:inta=0,b=0;auto[x,y]=std::tie(a,b);y=1;std::cout由于我使用了auto,我希望代码打印00因为y应该是一个拷贝。但是,它会打印01。为什么?我认为一个简单的auto永远不会推断出引用。 最佳答案 作为cppreference注意,[之前的声明部分(即auto在您的情况下)不适用于引入的标识符。相反,它适用于由编译器在幕后创建的隐藏变量。您的结构化绑定(bind)声明auto[x,y]=std::tie(a,b);大致相当于auto

c++ - 为什么在使用结构化绑定(bind)时 auto 似乎会推断出引用?

考虑以下使用来自C++17的结构化绑定(bind)的代码:inta=0,b=0;auto[x,y]=std::tie(a,b);y=1;std::cout由于我使用了auto,我希望代码打印00因为y应该是一个拷贝。但是,它会打印01。为什么?我认为一个简单的auto永远不会推断出引用。 最佳答案 作为cppreference注意,[之前的声明部分(即auto在您的情况下)不适用于引入的标识符。相反,它适用于由编译器在幕后创建的隐藏变量。您的结构化绑定(bind)声明auto[x,y]=std::tie(a,b);大致相当于auto

c++ - decltype 作为类成员函数中的返回类型

我在下面的代码编译时出错。structB{doubleoperator()(){return1.0;}};structA{autofunc()->decltype(b()){returnb();}Bb;};但是,如果我重新组织A,它会编译。gcc4.8表示'b'未在此范围内声明。structA{Bb;autofunc()->decltype(b()){returnb();}};那么,第一个有什么问题? 最佳答案 Isitvalid?您的最后一个示例格式正确,而第一个示例格式不正确(因此GCC是正确的)。关于不合格名称查找的第3.4.

c++ - decltype 作为类成员函数中的返回类型

我在下面的代码编译时出错。structB{doubleoperator()(){return1.0;}};structA{autofunc()->decltype(b()){returnb();}Bb;};但是,如果我重新组织A,它会编译。gcc4.8表示'b'未在此范围内声明。structA{Bb;autofunc()->decltype(b()){returnb();}};那么,第一个有什么问题? 最佳答案 Isitvalid?您的最后一个示例格式正确,而第一个示例格式不正确(因此GCC是正确的)。关于不合格名称查找的第3.4.

C++14 在方法定义中使用 auto 关键字

我有几个std::unordered_maps.他们都有一个std::string因为它们的key和数据不同。我想从给定map的键中创建一个csv字符串,因为该数据需要通过线路发送到连接的客户端。目前,我对每个单独的map都有一个方法。我想让这个通用,我想出了以下内容:std::stringmyClass::getCollection(auto&myMap){std::vectortmpVec;for(auto&elem:myMap){tmpVec.push_back(elem.first);}std::stringstreamss;for(auto&elem:tmpVec){ss我使

C++14 在方法定义中使用 auto 关键字

我有几个std::unordered_maps.他们都有一个std::string因为它们的key和数据不同。我想从给定map的键中创建一个csv字符串,因为该数据需要通过线路发送到连接的客户端。目前,我对每个单独的map都有一个方法。我想让这个通用,我想出了以下内容:std::stringmyClass::getCollection(auto&myMap){std::vectortmpVec;for(auto&elem:myMap){tmpVec.push_back(elem.first);}std::stringstreamss;for(auto&elem:tmpVec){ss我使

c++ - 为什么私有(private)成员变量上不允许使用 decltype?

假设我有这样的类(class):classFoo{std::vectorbar;public:std::vector&get_bar(){returnbar;}};然后,我想要另一个与bar具有相同类型的变量。如果我能做到这一点,那对我来说很有意义:decltype(Foo::bar)clone_of_bar;但这不起作用。编译器告诉我'std::vectorFoo::bar'是私有(private)的。所以我最终不得不使用这样的东西:std::remove_reference().get_bar())>::typeclone_of_bar;这可行,但看起来一团糟。也许有更简单的方法来

c++ - 为什么私有(private)成员变量上不允许使用 decltype?

假设我有这样的类(class):classFoo{std::vectorbar;public:std::vector&get_bar(){returnbar;}};然后,我想要另一个与bar具有相同类型的变量。如果我能做到这一点,那对我来说很有意义:decltype(Foo::bar)clone_of_bar;但这不起作用。编译器告诉我'std::vectorFoo::bar'是私有(private)的。所以我最终不得不使用这样的东西:std::remove_reference().get_bar())>::typeclone_of_bar;这可行,但看起来一团糟。也许有更简单的方法来

c++ - auto 对编译时间的影响

我们在C++11中获得的新auto关键字对我来说看起来很模板化,所以我的问题是-它会导致与模板相同的编译时间膨胀吗?关于多态lambda的相同问题:[](autoval){…}这本质上是一个模板lambda-这会影响编译时间吗? 最佳答案 C++11的auto关键字远没有模板那么重——它的编译时“开销”与sizeof相当,这意味着它很接近归零。与编译器在扩展期间需要执行大量计算的模板不同(C++中的模板语言是图灵完备的),auto关键字要求编译器确定表达式,这是编译器无论如何都知道的。事实上,即使没有auto关键字,它也必须弄清楚表

c++ - auto 对编译时间的影响

我们在C++11中获得的新auto关键字对我来说看起来很模板化,所以我的问题是-它会导致与模板相同的编译时间膨胀吗?关于多态lambda的相同问题:[](autoval){…}这本质上是一个模板lambda-这会影响编译时间吗? 最佳答案 C++11的auto关键字远没有模板那么重——它的编译时“开销”与sizeof相当,这意味着它很接近归零。与编译器在扩展期间需要执行大量计算的模板不同(C++中的模板语言是图灵完备的),auto关键字要求编译器确定表达式,这是编译器无论如何都知道的。事实上,即使没有auto关键字,它也必须弄清楚表