我有一个大班,拿着很多STL容器.
编译器会自动创建一个移动构造函数来将这些容器移动到目标,还是我必须自己创建?
我有一个愚蠢的问题.我尝试切换到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)
给出无效的演员
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++ 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 ++报告的错误吗?
我刚刚意识到阅读这个页面,std :: shared_ptr的构造函数与单个指针参数不是noexcept.
因此,以下代码包含可能的内存泄漏:
std::shared_ptr<int> p3 (new int);
Run Code Online (Sandbox Code Playgroud)
原因是可能发生两次分配:
这里有两个问题:
如果第二个分配抛出异常,第一个分配的内存泄漏,这是真的吗?
如果答案是肯定的:
使用std :: shared_ptr的正确习惯用法是什么?
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:相反,如果我们定义转换为另一个仿函数,为什么不允许相同的事情?
我有一个变量声明为:
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)
这可能吗?
我几乎可以肯定这是不可能的,但值得一试.
我正在为某个工具编写命令行界面.我在谈论一个调用另一个Java应用程序的Java应用程序.该工具System.exit在执行后调用,这反过来终止了我自己的执行环境.我不希望这样.
有没有办法忽略System.exit电话?
假设我们有两个线程,一个是在循环中读取bool而另一个可以在特定时间切换它.我个人认为这应该是原子的,因为sizeof(bool)在C++中是1个字节而你不是部分读/写字节但我想100%肯定.
那么是或否?
编辑:
另外供将来参考,同样适用于int?
c++ ×9
c++11 ×6
shared-ptr ×2
atomic ×1
boolean ×1
c++-chrono ×1
functor ×1
java ×1
memory-leaks ×1
nullptr ×1
time ×1
unique-ptr ×1
unit-testing ×1
x86 ×1