相关疑难解决方法(0)

移动POD-ish类型的语义

是否有任何一点实现移动构造函数并为仅包含基本类型的结构或类移动赋值运算符?例如,

struct Foo
{
    float x;
    float y;
    float z;

    /// ... ctor, copy ctor, assignment overload, etc...


};
Run Code Online (Sandbox Code Playgroud)

我可以看到,如果我有更复杂的东西,比如:

struct Bar
{
    float x,y,z;
    std::string Name;
};  
Run Code Online (Sandbox Code Playgroud)

我宁愿移动而Name不是复制它,移动ctor会有意义.然而,"移动"浮动并不(语义上)对我有意义.

思考?

c++ move-semantics

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

使用std :: unique_ptr将所有权转移到函数

我正在尝试学习如何使用智能指针并了解所有权.当我auto_ptr按值传递一个函数时,该函数将获取该指针的独占所有权.因此,当函数完成时,它会删除我传递给它的指针.

但是,当我尝试使用a时,我得到一个编译错误unique_ptr,就好像为unique_ptrs 禁用了复制赋值一样.通过unique_ptr引用传递似乎不会转移所有权,它只是给函数一个引用unique_ptr.

如何auto_ptr将所有权转移到与unique_ptrs 一起使用的功能?我希望得到一个详细教程的链接unique_ptr,因为到目前为止,我所阅读的内容似乎只是谈论auto_ptr或讨论Boost提供的智能指针,似乎忽略了unique_ptr因为shared_ptr它涵盖了它.

c++ smart-pointers

9
推荐指数
1
解决办法
6725
查看次数

如何在没有编译器警告的情况下将const引用返回给空字符串?

我有一个std::unordered_map<int, std::string>函数GetString(int key),它接受一个int键并从这个map返回一个字符串值.

当在地图中找不到密钥时,我必须返回一个空字符串.

#include <iostream>
#include <string>
#include <unordered_map>

std::unordered_map<int, std::string> map
{
    { 5, "somelongstring" }
};

const std::string& GetString(int key)
{
    auto iterator = map.find(key);
    if (iterator == map.end())
    {
        return "";
    }

    return iterator->second;
}

int main()
{
    std::cout << GetString(1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

问题是编译器给了我这个警告

warning C4172: returning address of local variable or temporary
Run Code Online (Sandbox Code Playgroud)

(使用MS Visual Studio 2013)或

warning: returning reference to temporary [-Wreturn-local-addr]
Run Code Online (Sandbox Code Playgroud)

(使用g ++ 4.9.2)

我发现的一种方法是static const std::string在顶部声明一个并返回它而不是空字符串文字 …

c++ string

9
推荐指数
1
解决办法
6244
查看次数

使用指针的C++拷贝构造函数

任何人都可以解释*p=*q这个C++代码的含义吗?这是一个复制构造函数的概念吗?

class A{
  //any code
}

int main(){
  A *p=new A();
  A *q=new A();
  *p=*q;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers copy-constructor

9
推荐指数
3
解决办法
4916
查看次数

C++ 11:移动语义是否涉及传递值?

我有一个看起来像这样的API:

void WriteDefaultFileOutput(std::wostream &str, std::wstring target)
{
    //Some code that modifies target before printing it and such...
}
Run Code Online (Sandbox Code Playgroud)

我想知道通过这样做启用移动语义是否合理:

void WriteDefaultFileOutput(std::wostream &str, std::wstring&& target)
{
    //As above
}
void WriteDefaultFileOutput(std::wostream &str, std::wstring const& target)
{
    std::wstring tmp(target);
    WriteDefaultFileOutput(str, std::move(tmp));
}
Run Code Online (Sandbox Code Playgroud)

或者这只是编译器应该能够弄清楚的样板?

c++ move-semantics c++11

8
推荐指数
1
解决办法
4486
查看次数

使用make_pair时,Visual Studio 2012中的c2664

我挖了一个旧项目并想编译它,但收到了几个错误,其中一些是c2664:

error C2664: 'std::make_pair' : cannot convert parameter 1 from 'CUser *' to 'CUser *&&'
error C2664: 'std::make_pair' : cannot convert parameter 1 from 'unsigned long' to ' unsigned long &&'
Run Code Online (Sandbox Code Playgroud)

相关的代码部分是:

//typedef for the userdata map
typedef std::map<unsigned long, std::pair<CUser*,userstatus*>> UserDataMapType;
//...
Inc::incret CUserManager::AddUser(unsigned long ID, CUser* pUser, userstatus* pUserStatus)
{
    //...
    std::pair<UserDataMapType::iterator, bool> ret = m_mapUserData.insert(std::make_pair<unsigned long, std::pair<CUser*, userstatus*>>(ID, std::make_pair<CUser*, userstatus*>(pUser, pUserStatus)));
    //...
}
Run Code Online (Sandbox Code Playgroud)

我试图制作函数参数const,但这没有帮助.

它确实在VS2010中编译得很好.

请帮我找到导致此问题的原因以及解决方法.

visual-c++ std-pair visual-studio-2012

8
推荐指数
1
解决办法
5787
查看次数

将元素添加到抽象类的std :: vector中

我想在一个抽象类的std :: vector中存储从公共接口(抽象类)派生的类的对象.这个向量应该填充一个循环,通常我会调用类的构造函数并将创建的对象推送到向量中.

据我所知,在抽象类的情况下,我只能存储指向该类的指针,所以我需要push_back派生类的指针.但是,我不确定这些新创建的对象的范围.

请看下面的代码.这段代码编译并正常工作,但我的问题是:

a)对象是否保证存在于main函数的第二个for循环中?或者他们可能会停止存在超出创建它们的循环范围?

b)是否所有对象的析构函数都被调用或存在内存泄漏?

#include<vector>
#include<iostream>
class Interface {
    public:
    Interface( int y ) : x(y) {}
    virtual ~Interface() {}
    virtual void f() = 0;
    int x;  
};

class Derived_A : public Interface {
    public:
    Derived_A( int y ) : Interface(y) {}
    void f(){ return; }
};

class Derived_B : public Interface {
    public:
    Derived_B( int y ) : Interface(y) {}
    void f(){ return; }
};


int main()
{
    std::vector<Interface*> abstractObjects;
    int N = 5;
    for(int ii …
Run Code Online (Sandbox Code Playgroud)

c++ vector

8
推荐指数
1
解决办法
4572
查看次数

由于右值引用,在C++ 0x中是std :: swap atomic吗?

由于我们在C++ 0x中有rvalue引用,在我看来应该可以将std :: swap实现为CAS的原子操作.这是新标准的情况,如果不是为什么?

c++ c++11

7
推荐指数
2
解决办法
3131
查看次数

从std :: tuple解压缩的值的返回值优化

是否有任何编译器能够通过std :: tuple对函数返回的多个值进行返回值优化?需要说明的是,在下面的代码中,是否有任何编译器能够避免不必要的副本?

std::vector<int> a;
std::list<float> b;
std::tie(a,b) = myFunctionThatReturnsAVectorAndList();
Run Code Online (Sandbox Code Playgroud)

c++ tuples return-value-optimization c++11

7
推荐指数
1
解决办法
476
查看次数

std :: move()在没有move-ctor的情况下调用copy-ctor.为什么以及如何预防呢?

我想知道是否有一种安全的编程实践可以提醒编码人员在发生这种微妙的行为时,或者更好的是,首先要避免它.

的用户struct A可能不知道有没有转移构造.在他们试图调用缺席的ctor时,他们既没有得到编译器警告,也没有得到复制ctor被调用的任何运行时指示.

下面的答案解释了发生的转换,但我认为这不是一个好事.如果缺少使用const引用作为参数的构造函数,则会出现编译时错误,而不仅仅是解析为非const引用版本.那么,为什么在类中没有实现移动语义时,尝试使用移动语义会导致编译时错误?

有没有办法通过一些编译时选项来避免这种行为,或者至少是一种在运行时检测它的方法?

如果他们在预料到这个问题,那么他们可以assert(source is null)在搬家之后,但这对许多问题都是如此.

示例,时间:

struct A {
    A() {...}
    A(A &a) {...}
    A(A const & A) {...}
};
Run Code Online (Sandbox Code Playgroud)

构造如下:

A a1;
A a2 = std::move(a1);  //calls const copy (but how would I know?)
Run Code Online (Sandbox Code Playgroud)

这导致调用复制ctor的const版本.现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数.

c++ move-semantics c++11

7
推荐指数
1
解决办法
1405
查看次数