相关疑难解决方法(0)

C++ 11是否允许vector <const T>?

容器需求已从C++ 03更改为C++ 11.虽然C++ 03有一揽子要求(例如复制构造性和向量的可赋值性),但C++ 11定义了每个容器操作的细粒度要求(第23.2节).

因此,只要您只执行某些不需要赋值的操作(构造并且push_back是这样的操作),您可以例如在向量中存储可复制构造但不可赋值的类型(例如具有const成员的结构).; insert不是).

我想知道的是:这是否意味着标准现在允许vector<const T>?我没有看到任何理由它不应该 - const T就像具有const成员的结构一样,是一种可复制构造但不可分配的类型 - 但我可能错过了一些东西.

(让我觉得我可能错过了一些东西的部分原因是,如果你试图实例化vector<const T>,那gcc trunk会崩溃并烧掉,但是vector<T>对于T有const成员的地方来说很好).

c++ const vector c++11

65
推荐指数
4
解决办法
1万
查看次数

如何在c ++ 11中返回类成员向量

我读了几篇关于如何从方法返回向量的帖子包括以下内容:

  1. c11 rvalues和移动语义混淆返回语句

  2. 希望速度超值

  3. 为什么visual studio不执行返回值优化rvo

  4. Wiki - 返回值优化

我仍然对如何在VS2013中以正确的方式传递向量感到困惑,以及此代码中的以下方法之间的区别(问题在注释中标记):

class Foo{
 private:
   std::vector<int> vect;

 public:
     //1 - classic way?
    void GetVect(std::vector<int>& v)
      {
         v = vect;// assignment with swap?
      }

    //2 - RVO?
    std::vector<int> GetVect()
      {
        return vect;
      } 

    //3 - RVO with const?
    std::vector<int> GetVect() const
      {
        return vect;
      }

    //4 - just move?
    std::vector<int> GetVect() 
      {
        return std::move(vect);
      }  

     //5 - move with {}?
    std::vector<int> GetVect() 
      {
        return { std::move(vect) };
      }  
 }
Run Code Online (Sandbox Code Playgroud)

所以我不确定// 1是否是// 2的显式形式,不确定3是否有效.4和5之间有什么区别?如果RVO适用于VS2013中的矢量,如何测试?

c++ std c++11

10
推荐指数
1
解决办法
6177
查看次数

如何根据模板参数制作方法const?

我有一个带有模板参数的类,我想调用它的方法.它看起来像这样:

template <typename T>
class Foo {
public:
    void doSomething() {
        for (auto& t: ts) {
            t.doSomething();
        }
    }
private:
    std::vector<T> ts;
};
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我想制作doSomething()const如果T它本身是const(假设它也是T::doSomething()const).我找到了一个可能的解决方案(基于这个问题),但我不喜欢它.

template <bool enabled = std::is_const<T>::value>
typename std::enable_if<enabled, void>::type
doSomething() const {
    for (auto& t: ts) {
        t.doSomething();
    }
}

template <bool enabled = !std::is_const<T>::value>
typename std::enable_if<enabled, void>::type
doSomething() {
    for (auto& t: ts) {
        t.doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它有代码重复.有什么办法可以避免吗?

c++ const

10
推荐指数
1
解决办法
766
查看次数

在Visual Studio 2012中初始化向量的静态const向量

我试图在Visual Studio 2012中创建一个int向量的静态const向量(这是一个更好的方法),我无法弄清楚用它来初始化它的正确语法.我相信2012年使用的C++版本不允许使用初始化程序,但我不知道如何完成我想要的工作.

我在2013年尝试了以下内容,似乎编译好了:

.H:

static const std::vector<const std::vector<int>> PartLibrary;
Run Code Online (Sandbox Code Playgroud)

的.cpp:

const std::vector<const std::vector<int>> Parts::PartLibrary {
    std::vector<int> { 29434 }, // 1
    std::vector<int> { 26322 }, // 2
...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在2012年尝试相同时,它会出错:

Error   1   error C2470: 'PartLibrary' : looks like a function definition, 
but there is no parameter list; skipping apparent body
Run Code Online (Sandbox Code Playgroud)

我该如何正确初始化这个?我可以使用更合适的数据类型吗?我只是希望我的静态类有一个常量向量的int,所以我可以快速读取,但不能修改值.

c++ vector visual-studio-2012

5
推荐指数
1
解决办法
1168
查看次数

标签 统计

c++ ×4

c++11 ×2

const ×2

vector ×2

std ×1

visual-studio-2012 ×1