小编R. *_*des的帖子

移动构造函数是自动生成的吗?

我有一个大班,拿着很多STL容器.
编译器会自动创建一个移动构造函数来将这些容器移动到目标,还是我必须自己创建?

c++ move-constructor c++11

32
推荐指数
1
解决办法
8750
查看次数

std :: chrono和cout

我有一个愚蠢的问题.我尝试切换到c ++ 11标头,其中一个是chrono.但我的问题是我无法控制时间操作的结果.例如:

auto t=std::chrono::high_resolution_clock::now();
cout<<t.time_since_epoch();
Run Code Online (Sandbox Code Playgroud)

得到:

初始化‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’ ... /usr/include/c++/4.6/ostream的 参数1

cout<<(uint64_t)t.time_since_epoch();
Run Code Online (Sandbox Code Playgroud)

给出无效的演员

c++ time c++11 c++-chrono

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

Haskell风格"可能"类型&*链接*在C++ 11中

Maybe在我的工作项目中,我反复发现自己需要Haskell风格(尤其是Maybe chaining).例如,来自客户的提款请求,我们获得客户ID ...在缓存中查找客户...如果找到客户...查找她的储蓄账户...如果有账户...退出...在任何指向此链中,如果存在查找失败,则不执行任何操作并返回失败.

我的链很大......有时只要6 ...所以这里是我Haskell.Data.Maybe在C++ 0x中的滑动...(注意......如果我停止使用可变参数模板,这应该在C++中工作).我已经开始为自由函数链接一个参数或成员函数没有参数,我对接口感到满意.但是,对于采用多个参数的函数...我必须编写一个lambda函数来模拟部分应用程序.有没有办法避免它?见最后一行main().即使它是未注释的,它也不会编译,而是用于const/non-const混合.但问题仍然存在.

对于大量的代码感到抱歉...我希望这不会让那些可能对此感兴趣的人感到震惊......

#include <iostream>
#include <map>
#include <deque>
#include <algorithm>
#include <type_traits>

typedef long long int int64;

namespace monad { namespace maybe {

  struct Nothing {};

  template < typename T >
  struct Maybe {
    template < typename U, typename Enable = void >
    struct ValueType {
      typedef U * const type;
    };

    template < typename U >
    struct ValueType < U, typename std::enable_if < std::is_reference < U >::value >::type > …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

30
推荐指数
2
解决办法
9251
查看次数

在null指针的情况下,删除器的标准行为在shared_ptr和unique_ptr之间是否不同?

好的,首先是一些可能相关的事情:

我在C++ 11模式下使用Clang 3.1编译器,标准库设置为libc ++.

我正在尝试熟悉C++ 11,并且这样做我遇到的行为似乎很奇怪.它可能是Clang或libc ++的怪癖,但我不能说C++标准,我无法访问其他支持C++ 11的编译器,所以我无法检查它,我搜索了互联网和Stack Overflow在没有发现任何相关的情况下尽我所能......所以我们走了:

当使用shared_ptr/unique_ptr为简单资源实现RAII时,它们的行为似乎与删除时的空指针不同.我意识到通常没有必要删除空指针,但我原本期望这两个STL智能指针之间的行为至少匹配.

对于特定情况,请考虑以下代码:

{
    auto Deleter = [](void *){cout << "It's later!" << endl;};
    shared_ptr<void> spDoSomethingLater(nullptr, Deleter);
    unique_ptr<void, void (*)(void *)> upDoSomethingLater(nullptr, Deleter);
    cout << "It's now!" << endl;
}
Run Code Online (Sandbox Code Playgroud)

我原本期望得到以下输出之一:

a)如果两个删除器都被调用,即使指针为空:

"It's now!"
"It's later!"
"It's later!"
Run Code Online (Sandbox Code Playgroud)

b)如果由于指针为空而未调用任何删除器:

"It's now!"
Run Code Online (Sandbox Code Playgroud)

但我没有观察到这些情况.相反,我观察到:

"It's now!"
"It's later!"
Run Code Online (Sandbox Code Playgroud)

这意味着正在调用一个但不是另一个删除者.经过进一步研究,我发现无论是否包含null值,都会调用shared_ptr的删除器,但只有在不包含空值的情况下才会调用unique_ptr的删除器.

我的问题:这实际上是标准规定的正确行为吗?如果是这样,为什么两种STL类型之间的指定行为会以这种方式不同?如果没有,这是一个我应该向libc ++报告的错误吗?

c++ shared-ptr unique-ptr nullptr c++11

30
推荐指数
2
解决办法
2161
查看次数

std :: shared_ptr例外安全

我刚刚意识到阅读这个页面,std :: shared_ptr的构造函数与单个指针参数不是noexcept.

因此,以下代码包含可能的内存泄漏:

std::shared_ptr<int> p3 (new int);
Run Code Online (Sandbox Code Playgroud)

原因是可能发生两次分配:

  • 在调用构造函数之前的第一个
  • shared_ptr构造函数中的第二个(例如VS 2012中发生的情况)

这里有两个问题:

如果第二个分配抛出异常,第一个分配的内存泄漏,这是真的吗?

如果答案是肯定的:

使用std :: shared_ptr的正确习惯用法是什么?

  • 使用make_shared
  • 将第一个分配的所有权赋予std :: unique_ptr然后转移所有权
  • 其他想法 ?

c++ memory-leaks shared-ptr c++11

30
推荐指数
2
解决办法
3659
查看次数

为什么'X x; X();' 允许,当'X'定义转换为函数指针时,但不是,当它定义转换为仿函数时?

void f(int){}
typedef void (*f_ptr)(int);

struct Functor{
  void operator()(int){}
};

struct X{
  operator f_ptr(){ return f; }
};

struct Y{
  operator Functor(){ return Functor(); }
};

int main(){
  X x; Y y;
  x(5); // works ?!
  y(5); // doesn't ?!
}
Run Code Online (Sandbox Code Playgroud)

Ideone上的实例.输出:

错误:调用'(Y)(int)'不匹配

Q1:为什么调用x(5)允许,即使X只定义了转换为函数指针,而不是operator()

Q2:相反,如果我们定义转换为另一个仿函数,为什么不允许相同的事情?

c++ function-pointers functor function-call

29
推荐指数
1
解决办法
1067
查看次数

如何知道类枚举的基础类型?

我有一个变量声明为:

enum class FooEnum: uint64_t {}
Run Code Online (Sandbox Code Playgroud)

我想转换为它的基类型,但我不想硬编码基类型.例如,像这样:

FooEnum myEnum;
uint64_t * intPointer = (underlying_typeof(myEnum))&myEnum;
Run Code Online (Sandbox Code Playgroud)

这可能吗?

c++ c++11

29
推荐指数
3
解决办法
9377
查看次数

如何防止调用System.exit()终止JVM?

我几乎可以肯定这是不可能的,但值得一试.

我正在为某个工具编写命令行界面.我在谈论一个调用另一个Java应用程序的Java应用程序.该工具System.exit在执行后调用,这反过来终止了我自己的执行环境.我不希望这样.

有没有办法忽略System.exit电话?

java

28
推荐指数
2
解决办法
1万
查看次数

如何在Catch框架中使用浮点容差?

我正在使用Catch测试框架.

介绍性博客文章中,作者提到了以下功能:

  • 以易于使用的方式支持浮点公差

我找不到任何关于如何做到这一点的文档.怎么在Catch完成?

c++ unit-testing catch-unit-test

27
推荐指数
2
解决办法
5009
查看次数

bool读/写操作可以在x86上不是原子操作吗?

假设我们有两个线程,一个是在循环中读取bool而另一个可以在特定时间切换它.我个人认为这应该是原子的,因为sizeof(bool)在C++中是1个字节而你不是部分读/写字节但我想100%肯定.

那么是或否?

编辑:

另外供将来参考,同样适用于int

c++ x86 boolean atomic

27
推荐指数
3
解决办法
1万
查看次数