小编use*_*498的帖子

是否可以在C++中重置对另一个值的引用?

我知道通常在初始化之后重置参考是不可能的.

但是,我以某种方式尝试以下代码,它恰好适用于clang ++和g ++.

我的问题是,以下是一个有效的(行为定义的)C++?

std::string x = "x";
std::string y = "y";
std::string i = "i";
std::string j = "j";

// now references to x, y
std::pair<std::string &, std::string &> p { x, y };
p.first = "1"; //changes x
p.second = "2"; //changes y
// now references to i, j
new (&p) std::pair<std::string &, std::string &> {i, j};
p.first = "1"; //changes i
p.second = "2"; //changes j
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于g ++和clang ++,但它是不是很好的C++?谢谢.

c++ reference placement-new c++11

12
推荐指数
2
解决办法
1833
查看次数

奇怪的IE,Javascript只能在开发模式下工作(F12)

基本上,我有两个标签,一个是隐藏的,一个是显示的.

隐藏的一个将在后台加载视频,当前一个完成时,我将通过隐藏显示的一个来交换两个.

我还将在服务器端列出可播放的视频列表,我将使用ajax获取列表并决定下一个要加载的列表.

无论如何,你很难尝试这个,因为你需要一个视频服务器,我发现很难砍掉代码,所以我只会告诉你整个源代码(带一些注释),希望你能理解.

我使用了jquery和video.js.源代码如下,

HTML:

<div class="container" id="video-container-1">
</div>
<div class="container" id="video-container-2">
</div>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

//I am making a live video by chopping the video into MP4 files of 800ms each
//The play rate has to be adjustable or the local browser and live server will not sync
var play_rate = { 1.0:800, 1.01:790, 1.02:785, 1.03:777, 1.04:770, 1.05:762, 1.06:755, 1.07:748,
  1.08:741, 1.09:734, 1.1:727 };
var min_rate=1.0;
var max_rate=1.1;
var base_rate = 1.03;
var current_rate = base_rate;
var timer_value = play_rate[current_rate]; …
Run Code Online (Sandbox Code Playgroud)

html javascript video jquery internet-explorer

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

为什么c ++ 11正则表达式(libc ++实现)如此之慢?

我比较了Linux C正则表达式库,

#include <iostream>
#include <chrono>
#include <regex.h>

int main()
{
    const int count = 100000;

    regex_t exp;
    int rv = regcomp(&exp, R"_(([a-zA-Z][a-zA-Z0-9]*)://([^ /]+)(/[^ ]*)?)_", REG_EXTENDED);
    if (rv != 0) {
            std::cout << "regcomp failed with " << rv << std::endl;
    }

    auto start = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < count; i++)
    {
            regmatch_t match;
            const char *sz = "http://www.abc.com";

            if (regexec(&exp, sz, 1, &match, 0) == 0) {
    //              std::cout << sz << " matches characters …
Run Code Online (Sandbox Code Playgroud)

c c++ regex

9
推荐指数
2
解决办法
7846
查看次数

混合使用constexpr和const?

我读了一些标准库的CLang实现,它让我对const和constexpr感到困惑.

template<class _Tp, _Tp __v>
struct integral_constant
{
    static constexpr _Tp value = __v;
};

template<class _Tp, _Tp __v>
const _Tp integral_constant<_Tp, __v>::value;
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,它在类定义和const外部使用constexpr.我的问题是,是允许的吗?在什么情况下const和constexpr可以互换使用?当然constexpr函数不能应用于const,所以我说的是const数据和constexpr数据.

我确实在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf上阅读了一些标准草案和提案 ,但这让我感到更加困惑.所以我还有一些问题,

在N2235中,它明确指出,const数据不能保证是编译时常量,请参见下面的示例,

struct S {
    static const int size;
};
const int limit = 2 * S::size; // dynamic initialization
const int S::size = 256;
Run Code Online (Sandbox Code Playgroud)

和constexpr应该解决这个问题,所以至少在这种情况下,constexpr不允许如下,

struct S {
    static const int size;
};
constexpr int limit = 2 * S::size; // shall be error in my understanding
const int S::size = 256; …
Run Code Online (Sandbox Code Playgroud)

c++ const clang c++11

8
推荐指数
1
解决办法
1983
查看次数

冲突:C++标准和Windows实现中wchar_t字符串的定义?

来自c ++ 2003 2.13

宽字符串文字具有类型" n const wchar_t的数组 "并具有静态存储持续时间,其中n是字符串的大小,如下所定义

宽字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上一个用于终止L'\ 0'.

来自c ++ 0x 2.14.5

宽字符串文字的类型为" n const wchar_t的数组 ",其中n是字符串的大小,如下所示

char32_t或宽字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上一个用于终止U'\ 0'或L'\ 0'.

char16_t字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上需要代理项对的每个字符一个,加上一个用于终止u'\ 0'.

C++ 2003中的陈述非常模糊.但是在C++ 0x中,当计算字符串的长度时,宽字符串文字wchar_t应被视为与char32_t相同,并且与char16_t不同.

有一篇文章明确说明了windows如何在/sf/ask/28159841/?tab=votes%23tab-top中实现wchar_t

简而言之,Windows中的wchar_t是16位并使用UTF-16编码.标准中的陈述显然在Windows中留下了一些冲突.

例如,

wchar_t kk[] = L"\U000E0005";
Run Code Online (Sandbox Code Playgroud)

这超过16位,对于UTF-16,它需要两个16位来编码它(代理对).

但是,从标准来看,kk是2个wchar_t的数组(1表示通用名称\ U000E005,1表示\ 0).

但是在内部存储中,Windows需要3个16位wchar_t对象来存储它,2个wchar_t用于代理对,1个wchar_t用于\ 0.因此,从数组的定义来看,kk是一个3 wchar_t的数组.

这显然是相互冲突的.

我认为Windows的一个最简单的解决方案是"禁止"在wchar_t中需要代理对的任何东西("禁止"在BMP之外的任何unicode).

我的理解有什么不对吗?

谢谢.

c++ unicode wchar-t string-literals c++11

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

c ++拷贝初始化和直接初始化,奇怪的情况

在继续阅读本文之前,请阅读复制初始化和直接初始化之间的C++是否存在差异?首先,确保你理解它在说什么.

我先在这里总结一下规则(阅读标准n3225 8.5/16,13.3.1.3,13.3.1.4和13.3.1.5),

1)对于直接初始化,所有构造函数都将被视为重载集,重载决策将根据重载决策规则选择最佳构造函数.

2)对于复制初始化,源类型与目标类型相同或从目标类型派生,规则与上面相同,只是只转换构造函数(没有显式的构造函数)将被视为重载集.这实际上意味着显式复制/移动构造函数不会被视为重载集.

3)对于上面(2)中未包含的复制初始化情况(源类型与目标类型不同而不是从目标类型派生),我们首先考虑可以从源类型转换为目标类型的用户定义转换序列或(当使用转换函数时)到其派生类.如果转换成功,则结果用于指示初始化目标对象.

3.1)在这个用户定义的转换序列中,根据8.5/16和13.3.1.4中的规则,将考虑转换ctors(非显式ctors)和非显式转换函数.

3.2)结果prvalue将直接初始化目标对象,如(1)中列出的规则,见8.5/16.

好吧,对于规则来说,让我们看看一些奇怪的代码,我真的不知道我的推理错在哪里,或者只是所有编译器都错了.请帮帮我,谢谢.

struct A
{
    A (int) { }
    A() { }
    explicit A(const A&) { }
};
struct B
{
    operator A() { return 2; }
    //1) visual c++ and clang passes this
    //gcc 4.4.3 denies this, says no viable constructor available
};
int main()
{
    B b;
    A a = b;
    //2) oops, all compilers deny this
}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,对于(1),

operator A() { return 2; } …
Run Code Online (Sandbox Code Playgroud)

c++ constructor copy-constructor explicit-constructor

6
推荐指数
1
解决办法
4082
查看次数

关于左值到右值的转换,何时需要?

我一直在互联网上阅读很多,似乎很多人提到了以下规则(但我在标准中找不到它),

加法运算符+(和所有其他二元运算符)要求两个操作数都是rvalue,结果是rvalue.等等..

我检查了C++标准,并明确指出(第3.10/2条),

每当glvalue出现在期望prvalue的上下文中时,glvalue就会转换为prvalue

(第5/9条),

每当glvalue表达式作为操作符的操作数出现时,该操作符需要该操作数的prvalue,左值到右值(4.1),数组到指针(4.2)或函数到指针(4.3)标准转换是用于将表达式转换为prvalue.

它使用一个术语操作数"期望"一个prvalue.但是,当我查看加法运算符,乘法运算符等时,它只提到,结果是一个prvalue,但它没有说明操作数是"预期"的内容.

二元运算符是否真的期望操作数是prvalue在以下情况下会有所不同,

int b = 2;
int a = b + 1;
Run Code Online (Sandbox Code Playgroud)

如果b预期是prvalue,那么这里将进行左值到右值的转换,然后它将执行prvalue + prvalue并返回一个prvalue,结果prvalue被赋值给一个左值a.

但是,如果b不需要是prvalue,则它将是lvalue + prvalue,结果是prvalue.

我真的想知道标准在哪里明确地或隐含地提到不同运营商的规则?我检查了所有运算符部分和只有少数运算符,标准明确提到操作数和结果是左值还是右值.对于大多数运营商而言,标准仅提及结果,而不是操作数要求.

谢谢.


顺便说一下,我在标准5.19中发现关于常量表达式可能非常"隐含地"暗示二元运算符需要对操作数进行左值到右值的转换.有关详细信息,请参阅我之前的问题,

混合使用constexpr和const?

条件表达式是常量表达式,除非它涉及以下之一作为潜在评估的子表达式(3.2).

...

- 除非适用,否则为左值 - 右值转换(4.1)

----一个整数或枚举类型的glvalue,它引用一个带有前面初始化的非易失性const对象,用一个常量表达式初始化

谢谢阅读.

c++ rvalue lvalue lvalue-to-rvalue

6
推荐指数
1
解决办法
895
查看次数

Linux中的C++相当于Python的time.time()?

我有一个Python程序和一个C++程序.他们通过IPC进行通信.

Python将向C++程序发送JSON {"event_time":time.time()}.

C++程序将记录此时间,并根据通过Python发送的时间将事件插入到自己的事件队列中.我需要从Python和c ++中比较和减去两个时间值的操作.

Python的time.time()是一个简单的双数,可以轻松地进行比较和排序(例如,它类似于1428657539.065105).

C++中有没有与此值相同的东西?他们至少应该同意毫秒精度而不是秒精度?即,如果我在同一时间执行这两个程序,它们应该以秒为单位获得相同的值,并在毫秒范围内获得微小的差异.

如果没有,那么我必须回归使用年,月,日,小时,分钟,证券交易所,MILLISECOND策略.比较,两个时间值之间的减法等将比双重比较和双减法更难.

c++ python linux

6
推荐指数
1
解决办法
1369
查看次数

当领导者提交日志条目并在通知追随者此承诺之前崩溃时,raft 如何保持安全?

根据我的理解,领导者向追随者发送 AppendEntries RPC,如果大多数追随者返回成功,领导者将提交此条目。它会通过将其应用到自己的状态机来提交此条目,并且还会返回给客户端,让客户端知道该命令已成功。

然而,目前,追随者还不知道这一承诺。它将在下一个 AppendEntries(或心跳)RPC 调用中通知关注者。

在最简单的情况下,如果leader在提交之后、下一个AppendEntries之前崩溃,raft将使用“只有最新的follower才能获胜”策略来确保下一个leader必须包含这个日志条目(尽管没有提交),新的领导者将提交该条目并将 AppendEntries 发送给其他追随者。这样,日志条目就可以安全保存。

然而,请考虑以下复杂的场景(摘自博士论文“共识:理论与实践的桥梁”第 23 页)。

在此输入图像描述

此时,第 2 项的日志条目已复制到大多数服务器上,但尚未提交。如果 S1 如 (d1) 那样崩溃,S5 可以当选为领导者(通过 S2、S3 和 S4 的投票)并用第 3 期中自己的条目覆盖该条目。

如果此时在服务器 S1 中已提交,但在其他服务器中尚未提交怎么办?如果 S1 然后像 (d1) 那样崩溃,该日志条目将被 S5 覆盖吗?

根据我的理解,提交的条目(应用于状态机并可能通知客户端结果)永远不会被覆盖?

我是否误解了筏协议的任何内容?

谢谢。

distributed-computing distributed-system consensus raft

6
推荐指数
1
解决办法
678
查看次数

Google http/oauth2 api始终为第二个HTTPRequest抛出EOFException

我是android的新手.我尝试使用OAuth2实现一个简单的客户端/服务器连接,过程是,

  1. 尝试使用ClientCredentials(client_id和client_secret)连接到OAuth2服务器并获取访问令牌.

  2. 使用访问令牌注册用户.

所以它涉及两轮连接.第一轮总是很好,第二轮http连接总是返回EOFException,这让我很困惑.相关代码如下(它包含在一个在新线程中运行的过程中).

NetHttpTransport transport = new NetHttpTransport();
JacksonFactory factory = new JacksonFactory();
//use http for testing only, will use https for deployed environment
GenericUrl url = new GenericUrl("http://192.168.x.x/oauth2/token");
//client_id & client_secret
BasicAuthentication auth = new BasicAuthentication("abc","abc");
ClientCredentialsTokenRequest token =
     new ClientCredentialsTokenRequest(transport, factory, url)
           .setClientAuthentication(auth);
TokenResponse response = token.execute();

//ok, i can get access token in response without problem

Credential credential = 
      new Credential(BearerToken.authorizationHeaderAccessMethod())
             .setFromTokenResponse(response);
//note that I reuse the transport, but using a new transport2 doesn't help
HttpRequestFactory …
Run Code Online (Sandbox Code Playgroud)

android httprequest oauth-2.0 google-oauth

5
推荐指数
1
解决办法
323
查看次数