是否有任何一点实现移动构造函数并为仅包含基本类型的结构或类移动赋值运算符?例如,
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会有意义.然而,"移动"浮动并不(语义上)对我有意义.
思考?
我正在尝试学习如何使用智能指针并了解所有权.当我auto_ptr按值传递一个函数时,该函数将获取该指针的独占所有权.因此,当函数完成时,它会删除我传递给它的指针.
但是,当我尝试使用a时,我得到一个编译错误unique_ptr,就好像为unique_ptrs 禁用了复制赋值一样.通过unique_ptr引用传递似乎不会转移所有权,它只是给函数一个引用unique_ptr.
如何auto_ptr将所有权转移到与unique_ptrs 一起使用的功能?我希望得到一个详细教程的链接unique_ptr,因为到目前为止,我所阅读的内容似乎只是谈论auto_ptr或讨论Boost提供的智能指针,似乎忽略了unique_ptr因为shared_ptr它涵盖了它.
我有一个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在顶部声明一个并返回它而不是空字符串文字 …
任何人都可以解释*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) 我有一个看起来像这样的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)
或者这只是编译器应该能够弄清楚的样板?
我挖了一个旧项目并想编译它,但收到了几个错误,其中一些是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中编译得很好.
请帮我找到导致此问题的原因以及解决方法.
我想在一个抽象类的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++ 0x中有rvalue引用,在我看来应该可以将std :: swap实现为CAS的原子操作.这是新标准的情况,如果不是为什么?
是否有任何编译器能够通过std :: tuple对函数返回的多个值进行返回值优化?需要说明的是,在下面的代码中,是否有任何编译器能够避免不必要的副本?
std::vector<int> a;
std::list<float> b;
std::tie(a,b) = myFunctionThatReturnsAVectorAndList();
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种安全的编程实践可以提醒编码人员在发生这种微妙的行为时,或者更好的是,首先要避免它.
的用户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版本.现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数.