小编rya*_*ner的帖子

什么是"这个的右值参考"?

在clang的C++ 11状态页面中遇到了一个名为"rvalue reference for*this"的提案.

我已经阅读了很多关于rvalue引用并理解它们的内容,但我认为我不知道这一点.我也无法使用这些条款在网上找到太多资源.

页面上的提案文件有一个链接:N2439(将移动语义扩展到*this),但我也没有从中获得太多的例子.

这个功能是什么?

c++ qualifiers c++-faq move-semantics c++11

229
推荐指数
3
解决办法
2万
查看次数

我在哪里可以找到小黄瓜语言规范/指南?

我试图在Gherkin中找出所有可用的语法/格式,例如关于多线参数和其他我还不知道的其他内容.

在挖掘Google搜索结果后,似乎综合指南位于此处:

我认为这是非常好的,有一个链接到一个页面,据说可以描述多行参数和其他,但它带我到404找不到=(.

有没有人有更好的建议在哪里阅读这个?

编辑:强调我已经完成了很多谷歌搜索.它提供了一些相当不错的网站,如specflowcuke4ninja,但它们都没有给出小黄瓜的全面描述.如果有人通过谷歌搜索找到答案,那么请随时给我打个谷歌搜索菜单,欢迎提出改进建议.

cucumber specflow gherkin

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

这会编译吗?重载分辨率和隐式转换

这个例子似乎用VC10和gcc编译(虽然我的gcc版本很老).

编辑:R.Martinho Fernandez在gcc 4.7上试过这个并且行为仍然是一样的.

struct Base
{
    operator double() const { return 0.0; }
};

struct foo
{
    foo(const char* c) {}
};

struct Something : public Base
{
    void operator[](const foo& f) {}
};

int main()
{
    Something d;
    d["32"];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但克朗抱怨道:

test4.cpp:19:6: error: use of overloaded operator '[]' is ambiguous (with operand types 'Something' and 'const char [3]')
    d["32"]
    ~^~~~~
test4.cpp:13:10: note: candidate function
    void operator[](const foo& f) {}
         ^
test4.cpp:19:6: note: built-in candidate operator[](long, const …
Run Code Online (Sandbox Code Playgroud)

c++ clang visual-c++ overload-resolution implicit-conversion

18
推荐指数
1
解决办法
1630
查看次数

英特尔SFENCE是否具有发布语义?

似乎接受和释放语义的公认定义是这样的:(引自http://msdn.microsoft.com/en-us/library/windows/hardware/ff540496(v=vs.85).aspx)

如果其他处理器在任何后续操作的效果之前始终看到其效果,则操作已获取语义.如果其他处理器在操作本身的影响之前将看到每个先前操作的效果,则操作具有释放语义.

我简要地读过半存储器障碍的存在,并且据说它们具有获取障碍的风格并且遵循上述相同的语义释放障碍.

查看硬件指令的真实示例我遇到了SFENCE.此博客(http://peeterjoot.wordpress.com/2009/12/04/intel-memory-ordering-fence-instructions-and-atomic-operations/)表示它是一种释放栅栏/屏障:

英特尔提供双向围栏指令MFENCE,获取围栏LFENCE和释放围栏SFENCE.

但是,阅读SFENCE的定义,它似乎没有提供发布语义,因为它根本不与负载同步?而我所理解的释放语义定义了关于所有内存操作(加载和存储)的排序.

concurrency multithreading memory-barriers

15
推荐指数
1
解决办法
1965
查看次数

std :: bind和std :: thread总是复制参数的基本原理是什么?

众所周知,std :: bind和std :: thread的默认行为是它将复制(或移动)传递给它的参数,并且使用引用语义我们将不得不使用引用包装器.

  1. 有谁知道为什么这会产生良好的默认行为?ESP.在带有右值引用和完美转发的C++ 11中,在我看来,完全转发参数更有意义.

  2. std :: make_shared虽然并不总是复制/移动,但只是完全转发提供的参数.为什么这里有两种看似不同的转发参数行为?(std :: thread和std :: bind总是复制/移动vs std :: make_shared不会)

c++ stl c++11

10
推荐指数
2
解决办法
1646
查看次数

为什么这种双重检查锁定正确?(.净)

我已经阅读了很多关于双重检查锁定的危险,我会努力远离它,但据说说我认为它们是一个非常有趣的阅读.

我正在阅读Joe Duffy关于使用双重检查锁定实现单例的这篇文章:http: //www.bluebytesoftware.com/blog/PermaLink,guid,543d89ad-8d57-4a51-b7c9-a821e3992bf6.aspx

而他似乎提出的(变体)解决方案是这样的:

class Singleton {
private static object slock = new object();
private static Singleton instance;
private static int initialized;
private Singleton() {}
public Instance {
    get {
        if (Thread.VolatileRead(ref initialized) == 0) {
            lock (slock) {
                if (initialized == 0) {
                    instance = new Singleton();
                    initialized = 1;
                }
            }
        }
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我的问题是,是否仍然存在写入重新排序的危险?具体来说这两行:

instance = new Singleton();
initialized = 1;
Run Code Online (Sandbox Code Playgroud)

如果这些写入被反转,那么其他一些线程仍然可以读取null.

c# concurrency singleton locking thread-safety

7
推荐指数
1
解决办法
814
查看次数

真实世界Haskell书 - Logger monad例子的渐近复杂性

我刚刚到达真实世界Haskell的第14章,并且昨天对此感到疑惑.

在Logger monad示例中,bind函数实现如下:

-- (>>=) :: Logger a -> (a -> Logger b) -> Logger b
    m >>= k = let (a, w) = execLogger m
                  n      = k a
                  (b, x) = execLogger n
              in Logger (b, w ++ x)
Run Code Online (Sandbox Code Playgroud)

其中,注入器函数中的第二个元素包含我们的日志消息,这些消息是使用++连续添加的.(有关更多背景,请在此处在线阅读.)

我的问题是..不会使运行时的复杂性使用这个Logger二次到消息的数量?

如果我错了,请帮助提供正确的分析和大哦符号.

如果我是对的,我希望那些对Haskell和本书有更多经验/见解的人可以告诉我选择该实现的一些原因,以及为什么它没问题.在本书的前一章中,有一节说明这种附加列表的方式很糟糕,并教会我们差异列表技术.为什么这里没有使用?

顺便说一句,我喜欢这本书,这本书将成为一本书,我会在很长一段时间内阅读这本书.

algorithm complexity-theory haskell time-complexity

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

clang:将const char16_t*(UTF-16)转换为wstring(UCS-4)

我正在尝试将UTF-16编码的字符串转换为UCS-4

如果我理解正确,C++ 11通过codecvt_utf16提供此转换.

我的代码是这样的:

#include <iostream>
#include <locale>
#include <memory>
#include <codecvt>
#include <string>

using namespace std;

int main()
{
    u16string s;

    s.push_back('h');
    s.push_back('e');
    s.push_back('l');
    s.push_back('l');
    s.push_back('o');

    wstring_convert<codecvt_utf16<wchar_t>, wchar_t> conv;
    wstring ws = conv.from_bytes(reinterpret_cast<const char*> (s.c_str()));

    wcout << ws << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:显式的push_backs来解决我的clang版本(Xcode 4.2)没有unicode字符串文字这一事实.

代码运行时,我得到终止异常.我在这里做违法的事吗?我认为它应该工作,因为我传递给wstring_convert的const char*是UTF-16编码的,对吧?我也认为字节顺序是问题,但我已经检查过情况并非如此.

c++ unicode macos clang c++11

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