在C++ 98中,C++编译器可以通过成员方式复制自动生成复制构造函数和复制赋值运算符,例如
struct X {
std::string s;
std::vector<int> v;
int n;
};
Run Code Online (Sandbox Code Playgroud)
编译器使用成员方式复制自动生成复制构造函数和复制赋值运算符X.
但是,C++ 11中的移动语义如何改变?
是否自动生成移动 构造函数和移动 赋值运算符 ,如复制构造函数和复制赋值运算符?
是否存在不自动生成移动操作的情况?
我有一个返回常量char指针的方法.它使用a std::string并最终返回其c_str()char指针.
const char * returnCharPtr()
{
std::string someString;
// some processing!.
return someString.c_str();
}
Run Code Online (Sandbox Code Playgroud)
我从COVERITY工具得到一份报告,上面的说法不是很好.我已经google了,并且发现返回的char指针一旦someString遇到它的破坏就会失效.
鉴于此,如何解决这个问题?如何准确返回char指针?
返回std::string将解决此问题.但我想知道是否有其他方法可以做到这一点.
此代码使用MSVC 2015进行编译,但不使用Clang 5.0.0(主干304874)进行编译:
template <typename T>
struct Base
{
T data;
};
template <typename T>
struct Derived : Base<T>
{
auto getData() const
{
return data;
}
};
Run Code Online (Sandbox Code Playgroud)
data用this->datain 替换Derived::getdata()让Clang高兴.
根据C++标准,哪个编译器是正确的?
必须this->在模板代码中使用才能访问基类的标识符?
请考虑以下示例:
#include <sstream>
template <typename T>
inline std::string to_string(T const & op) {
std::ostringstream result;
result << op;
return result.str();
}
Run Code Online (Sandbox Code Playgroud)
如果我要返回结果,而不是result.str()它将自动成为右值.不是结果中包含的字符串(我假设).我的期望是它被复制并且副本作为右值返回.
所以我的问题是,合法的是:
return std::move(result.str());
Run Code Online (Sandbox Code Playgroud)
我认为它是,期望流留下一个有效的空字符串.但我不确定实际做到这一点.
每次循环运行时是否可以生成不同的随机数.例如,我有:
for (int t=0;t<10;t++)
{
int random_x;
srand ( time(NULL) );
random_x = rand() % 100;
cout<<"\nRandom X = "<<random_x;
}
Run Code Online (Sandbox Code Playgroud)
但问题是,它每次都会生成相同的随机数.每次循环运行都可以生成不同的随机数吗?
是否有可能重置随机数初始化?
使用VS2010构建时,以下C#代码似乎比使用VS2008 运行速度慢:在Core i5 Win7 x64 8 GB RAM PC上,VS2008内置版本在大约7.5秒内对字符串进行排序,而VS2010内置版本需要大约9秒.这是为什么?
我的代码有什么问题吗?
排序算法是否在VS2010中发生了变化?
底层CLR中有什么不同会使性能变差吗?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
namespace StringSortCSharp
{
/// <summary>
/// Console app to test string sorting performance in C#.
/// </summary>
class Program
{
/// <summary>
/// Displays the first lines from a vector of strings.
/// </summary>
/// <param name="wishedN">Number of lines to display.</param>
/// <param name="lines">Source lines to display.</param>
private static void DisplayFirst(int wishedN, List<string> lines)
{
int …Run Code Online (Sandbox Code Playgroud) 我不知道如何将a转换 std::wstring为aWCHAR*
std::wstring wstrProcToSearch;
WCHAR * wpProcToSearch = NULL;
std::wcin >> wstrProcToSearch; // input std::wstring
// now i need to convert the wstring to a WCHAR*
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
我将构建一个自定义分配器,预分配一个大块(数组)来存储N某些类的元素T,然后只需增加数组内的索引来为服务分配请求.
因为我不希望对预分配块中的元素进行任何初始化,所以这样的东西不起作用:
T buffer[N];
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下,T将为N块的元素调用构造函数.
既然我的理解是std::aligned_storage不调用T构造函数,我想使用std::aligned_storage,像这样:
std::aligned_storage<
N * sizeof(T),
std::alignment_of<T>::value
>::type buffer;
T* base = static_cast<T*>( static_cast<void*>(&buffer) );
Run Code Online (Sandbox Code Playgroud)
然后,当请求T的分配(直到(base+N))时,分配器可以仅增加基指针,并且在需要时可以在适当的位置构建T (具有放置new).
我想使用此方案为STL容器定义自定义分配器.但是,在我看来,重新绑定可能存在问题.事实上,如果我的理解是正确的,一个STL分配器应支持从类型重新绑定T到一个类型U,例如,因为喜欢的容器std::list<T>(或其它基于节点的容器一样std::map)使用allocator分配的节点上,但不是类型T,但不同type U(包含T节点的"header"开头信息).那么,上述std::aligned_storage方法是否适用于重新绑定?或者(我认为)Ts 的正确对齐并不意味着另一种不同类型的正确对齐U?
怎么可以解决这个问题?
我怎样才能定义上述内容buffer …
我的理解是C++ 隐式生成的赋值运算符执行成员方式的复制(这似乎也得到了这个答案的证实).但是,如果在成员副本期间抛出异常(例如,因为无法分配该成员的资源),被复制的对象是否会陷入无效状态?
换句话说,隐式生成的赋值运算符是仅实现基本保证,而不是强保证?
如果我们想要为我们的类副本提供强有力的保证,我们是否必须使用copy-and-swap惯用法手动实现赋值运算符?
在C++ 中传递回调函数参数的最佳方法是什么?
我想过简单地使用模板,像这样:
template <typename Function>
void DoSomething(Function callback)
Run Code Online (Sandbox Code Playgroud)
这是例如std::sort用于比较功能对象的方式.
通过使用&&怎么样?例如:
template <typename Function>
void DoSomething(Function&& callback)
Run Code Online (Sandbox Code Playgroud)
这两种方法的优点和缺点是什么,为什么STL使用前者std::sort?