在重新分配时,在确定是否移动或复制元素之前,向量将检查移动构造函数是否标记为noexcept.默认移动构造函数是否定义为noexcept?我看到了以下文档,但没有说明这一点.http://en.cppreference.com/w/cpp/language/move_constructor
隐式声明的移动构造函数
如果没有为类类型(结构,类或联合)提供用户定义的移动构造函数,并且满足以下所有条件:没有用户声明的复制构造函数没有用户声明的复制赋值运算符没有用户声明的移动赋值运算符没有用户声明的析构函数,由于下一节中详述的条件,隐式声明的移动构造函数未定义为已删除,因此编译器将声明移动构造函数作为其类的内联公共成员signature T :: T(T &&)一个类可以有多个移动构造函数,例如T :: T(const T &&)和T :: T(T &&).如果存在一些用户定义的移动构造函数,则用户仍可以使用关键字default强制生成隐式声明的移动构造函数.
我遇到了以下情况.在nullptr上进行移动有什么好处吗?我假设它基本上为Node*分配一个零,所以我不确定在这里做一个移动是否有任何好处.有什么想法吗?
template <typename T>
struct Node
{
Node(const T& t): data(t), next(std::move(nullptr)) { }
Node(T&& t): data(std::move(t)), next(std::move(nullptr)) { }
T data;
Node* next;
};
Run Code Online (Sandbox Code Playgroud) 嗨我使用gcc 4.7创建了一个带有noexcept移动构造函数的类Foo,并将向量保留大小设置为2,这样在添加第3项时就必须重新分配大小.在执行此操作时,它似乎正在调用复制构造函数而不是移动构造函数.我在这里错过了什么吗?
#include <vector>
#include <iostream>
class Foo
{
public:
Foo(int x) : data_(x)
{
std::cout << " constructing " << std::endl;
}
~Foo()
{
std::cout << " destructing " << std::endl;
}
Foo& operator=(const Foo&) = default;
Foo& operator=(Foo&&) = default;
Foo(Foo&& other) noexcept : data_(std::move(other.data_))
{
std::cout << " Move constructing " << std::endl;
}
Foo(const Foo& other) noexcept : data_(other.data_)
{
std::cout << " Copy constructing " << std::endl;
}
private:
int data_;
};
int main ( …
Run Code Online (Sandbox Code Playgroud) 我有一个关于对象中的重载函数的默认值的问题.
如果我有一个函数签名,如下所示,默认值只评估一次或每次?
class X
{
public:
f(const RWDate& d=RWDate::now());
}
// when calling f() do I get the current time each time?
X z;
z.f();
// is the default value of d recaculated in the function call?
z.f();
Run Code Online (Sandbox Code Playgroud) 如果我声明一个2d c风格的数组
int data[X][Y]
我假设编译器会将其创建为类似于的单个数组
int data[X*Y]
但这有保证吗?
让我们假设为简单起见,我们在x86架构上使用标准编译器.那怎么样?
int data[X][Y][Z]
?
编译器是否将其创建为连续的内存块,并且只是对偏移进行一些调整?
我通常使用单个向量作为带有偏移行*NumCols + col的2d数组,并且有一个内联函数来为我计算它,但我对这个问题的3d数组感兴趣.我还应该问一下是否有人用一个向量做了这个,也有偏移逻辑.
为什么key < x[mid]
下面的条件会导致编译器抱怨操作符未定义?
在C++中,只有当类型T不支持运算符<
语义时,这才是编译时警告.你如何在Java中做同等的事情?
package search;
public class BinarySearch<T>
{
public boolean binary_search_iterative (T[] x, T key)
{
int size = x.length;
if ( size == 0 ) { return false; }
int end = size - 1;
int start = 0;
while ( start <= end)
{
int mid = (end + start)/2 ;
if (key < x[mid])
{
end = mid - 1;
}
else if ( key > key[mid])
{
start = mid …
Run Code Online (Sandbox Code Playgroud) 我有一些代码正在执行以下操作,但我不明白using BaseTypeX::BaseTypeX
这个代码实际上做了什么
.其余部分我理解,所以请不要解释模板专业化等.
template<typename TReturn, typename... TArgs>
class ClassX<TReturn(TArgs...)> : public Internal::ClassXImpl<TReturn, TArgs...> {
public:
using BaseTypeX = Internal::ClassXImpl<TReturn, TArgs...>;
using BaseTypeX::BaseTypeX; // what is this doing exactly?
inline ClassX() noexcept = default;
// member function
template<class TThis, class TFunc>
inline ClassX(TThis* aThis, TFunc aFunc) {
this->bind(aThis, aFunc); // note bind is implemented in the ClassXImpl class
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于将boost :: threads与一些c ++ 11标准项混合和匹配的问题,这有用吗?我还没有真正测试过任何东西,但我正在使用一个系统,它使用所有boost :: threads和线程组以及你没有开箱即用的中断功能,所以没有变化.我们的boost 1.50版本并没有最新的std :: atomic和内存订购.我想知道我是否可以使用带有boost线程的std :: atomic和std :: memory排序操作load/fectch_add等(获取/释放,放松)并且具有与它们是std :: thread相同的结果.这些都是我的linux机器下的pthreads所以我认为答案是肯定我可以混合搭配.虽然,我只想确认并看看是否有人在混合boost :: thread和std :: thread apis之间存在任何兼容性问题.
我在Linux haswell盒上,但是在执行此操作时
gcc -march=native -Q --help=target
Run Code Online (Sandbox Code Playgroud)
它具有与编译器不同的编译器开关
gcc -march=haswell -Q --help=target
Run Code Online (Sandbox Code Playgroud)
我输入了以下内容以查看差异
diff -u <(gcc -march=native -Q --help=target) <(gcc -march=haswell -Q --help=target) | grep "^[-|+] "
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是否需要为编译器设置haswell架构类型配置错误的东西?
上面的diff命令显示了以下标志差异。
- -mabm [enabled]
+ -mabm [disabled]
- -maes [enabled]
+ -maes [disabled]
- -mavx [enabled]
- -mavx2 [enabled]
+ -mavx [disabled]
+ -mavx2 [disabled]
- -mbmi [enabled]
- -mbmi2 [enabled]
+ -mbmi [disabled]
+ -mbmi2 [disabled]
- -mcx16 [enabled]
+ -mcx16 [disabled]
- -mf16c [enabled]
+ -mf16c [disabled]
- -mfma [enabled]
+ …
Run Code Online (Sandbox Code Playgroud) 我的 .vimrc 文件中有以下映射,用于在窗口之间移动,但是当在 netrw 插件的浏览窗口 :e 中时,下移键将产生一个警告窗口,而不是尊重我的映射。我假设这个映射必须被硬编码到插件本身中。如何删除插件中的上移和上移映射。
nnoremap <silent> <S-Up> :wincmd k<CR>
nnoremap <silent> <S-Down> :wincmd j<CR>
Run Code Online (Sandbox Code Playgroud)
尝试上移或下移时显示的窗口如下所示,它显示在新的拆分中,这非常烦人:
**warning** (netrw) using Nexplore or <s-down> improperly; see help for netrw-starstar
Run Code Online (Sandbox Code Playgroud)
因此,我的问题是如何在 netrw 插件中关闭此行为,以便它尊重上面显示的映射。