小编yzt*_*yzt的帖子

C++中的网络库14

Herb Sutter在这里(在他的ISO C++ Spring 2013会议旅行报告中)写道,计划将一个网络库添加到C++ 14中.

这个库最初有哪些功能?它的基础是什么?是否存在概念验证实施?我的谷歌必须严重缺乏,因为我甚至找不到提案草案.

http://meetingcpp.com/上有一系列博客文章列出了C++ 14的提案:第1 部分,第2 部分,第3 部分第4部分.在所有这些中,我只能找到两个与网络相关的提议:

这都是?请问 C++网络库只有这些设施?我甚至不知道这些是否通过了投票,因为Michael Wong 对同一次会议的 部分评论(布里斯托尔,2013年4月)甚至没有提到它们.

c++ networking standards c++14

19
推荐指数
1
解决办法
7393
查看次数

转发到聚合初始化器?

在我看来,聚合初始化(合适的类型)不被认为是你可以实际调用的构造函数(除了少数情况.)

例如,如果我们有一个非常简单的聚合类型:

struct Foo {
    int x, y;
};
Run Code Online (Sandbox Code Playgroud)

那显然有效:

auto p = new Foo {42, 17};  // not "Foo (42, 17)" though...
Run Code Online (Sandbox Code Playgroud)

但这对我测试的任何编译器都不起作用(包括最新版本的MSVC,GCC和Clang):

std::vector<Foo> v;
v.emplace_back(2, 3);
Run Code Online (Sandbox Code Playgroud)

同样,在我看来,任何想要为类型调用构造函数T的代码(在这种情况下,vector::emplace_back将传递的参数转发给c'tor 的代码T)都不能简单地使用聚合初始化(看起来)因为它们使用括号而不是花括号!

这是为什么?它只是一个遗漏的功能(没有人提出/实施过它),还是有更深层次的原因?这有点奇怪,因为根据定义聚合类型没有其他构造函数来使解决方案模糊不清,因此语言可能刚刚定义了一个默认的聚合构造函数(或者其他东西),它将所有成员都作为默认参数.

这仅仅是语法问题吗?如果vector::emplace_back上面例子中的实现使用new了花括号而不是括号的位置,它会起作用吗?

注意:我要感谢那些已经指出行为的评论vector,emplace因为他们的评论对于那些使用这些关键字找到这个问题的人来说很有价值,但我也想指出那些只是例子.我选择了最熟悉和最简洁的示例,但我的观点是关于在任何代码中显式调用聚合初始值设定项(或placement new更具体地说.)

c++ c++17 c++20

12
推荐指数
1
解决办法
318
查看次数

检测类型何时不需要调用其析构函数

我正在编写一个 C++11 STL 兼容的分配器,我想知道如何检测调用其析构函数(在allocator<T>::destroy方法中)是安全的类型。

我已经编写了分配器(一个简单的分配器),据我所知,它确实有效。我问的原因是我在代码中收到警告(即在destroy分配器的方法中)。我正在使用最高警告级别的 VS2013 (vc12),警告是:

warning C4100: 'c' : unreferenced formal parameter
Run Code Online (Sandbox Code Playgroud)

在这个方法中:

template <typename T>
class MyAlloc
{
    ...

    template <typename C>
    void destroy (C * c) // <-- this is the 'c' that the warning is referring to
    {
        c->~C ();
    }

    ...
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,警告和代码都非常简单明了。在我看来,发出警告是因为该分配器所使用的某些类没有析构函数(例如,因为它们是 POD 等)。随后,编译器在以下情况下删除了对上述函数中析构函数的调用:正在为此类类实例化分配器,然后看到函数体为空并且参数未使用,发出警告。

我想我可以编写上述destroy方法的两个版本,使用 进行重载enable_if,并将主体留空,并在重载中将参数保留为未命名,该重载适用于不需要销毁的类。这行得通吗?

另一方面,这个警告只是一个很小的不便。我可以禁用这个特定的警告,它不会对我的代码库产生太大影响。毕竟,这并不是一个有用的警告。

然而,如果我确实尝试更改我的代码并检测不需要销毁的类,但做得不可靠且糟糕,我就会为各种痛苦和痛苦打开闸门。因为如果我碰巧没有破坏一个确实需要破坏的类的实例,那么只有上帝知道什么会(并且会)出错!因此,如果没有 100% 可靠且稳健的方法来检测此类并处理它们,我更愿意保留警告,甚至附带警告。

重申一下,我的问题分为三个部分:

  1. 我对警告原因的分析是否正确?
  2. 如何确定何时不调用类型的析构函数是安全的。换句话说,什么时候类型的析构函数完全没有效果,我如何检测到这一点(使用类型特征等)?
  3. 这种检测是否始终可靠且完全可靠?

还有一个额外问题:

我尝试了这个重载只是为了看看它是否有效:

template <typename C>
std::enable_if<std::is_trivially_destructible<C>::value>
destroy …
Run Code Online (Sandbox Code Playgroud)

c++ templates type-traits

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

用于双参数构造函数的用户定义文字

请考虑以下代码:

#include <iostream>

class Point
{
public:
    int x,y;
    Point(int newx, int newy) : x(newx), y(newy) {}
};

Point operator"" x(const unsigned long long i)
{
    return Point(i, 0);
}

int main()
{
    Point p = 5x;

    std::cout << "\npoint is " << p.x << "," << p.y << "\n\n";

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

UDL有效,但它是否可以使它适用于Point的构造函数的两个参数?例如,3x5是一个文字,Point(3,5)甚至是偶数3.5x,然后在操作员体中做一些数学运算,将整个部分与浮点数的小数部分分开..?

c++ operator-overloading user-defined-literals c++11

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

对于对象大小的`static_assert`更好的消息

我一直在使用static_assert(以及标准化之前的变体).我相信我们很多人都会使用它的一个用途是确保敏感数据结构的大小保持在平台和配置之间.例如:

class SizeSensitiveClass
{
    // ...
};

static_assert (sizeof(SizeSensitiveClass) == 18, "Check the size!");
Run Code Online (Sandbox Code Playgroud)

现在,我已经编写了一个方便的宏来帮助这个特殊用途:

#define STATIC_ASSERT_SIZE(T, sz)  (sizeof(T) == (sz), "Size of '" #T "' doesn't match the expected value.")
Run Code Online (Sandbox Code Playgroud)

像这样使用:

STATIC_ASSERT_SIZE (SizeSensitiveClass, 18);
Run Code Online (Sandbox Code Playgroud)

产生此输出:(在编译时,显然,以编译错误的形式)

'SizeSensitiveClass'的大小与预期值不匹配.

这很好,但我想知道是否可以扩展此宏的实现(保持接口完整)以输出当前大小和数据结构的预期大小.理想情况下,输出应该类似于:

'SizeSensitiveClass'的大小与预期值不匹配(20对18).

即使是目前的尺寸也会非常方便.这可能吗?

我正在使用VC12(Visual C++ 2013)和GCC 4.8.1.我很感激任何可以移植到至少这两个的解决方案/技术/方法.

我应该提到我已经尝试过常见的"stringize"技巧,但它不起作用(正如人们所预料的那样.)它只是sizeof(T)在输出中生成文字字符串.

我有一个模糊的概念,这可能是使用constexprs(生成消息字符串)实现的,但我不熟悉它们.

c++ static-assert c-preprocessor c++11

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

防止Visual C++内联函数

我用c ++写了一个简单的程序:

#include <stdio.h>

const signed char pass[] = "\x70\x61\x73\x73\x77\x6F\x72\x64";

bool __stdcall check_password(const signed char * str)
{
    unsigned int i;
    for(i=0;i<8;++i)
        if(str[i]!=pass[i])
            return false;
    return true;
}

int main(int argc, char * argv[])
{
    signed char buf[20];
    printf("please enter the password: ");
    scanf("%s",buf);
    printf((check_password(buf)) ? "correct!\n" : "incorrect.\nPress any key to exit..\n");
    getchar();
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)


并使用visual studio express 2010编译它.
我在OllyDbg中打开了结果,这就是我所看到的:

Address   Hex dump            Command                                          Comments
00FF1011  ³.  8B35 A020FF00   MOV ESI,DWORD PTR DS:[<&MSVCR100.printf>]
00FF1017  ³.  68 0021FF00     PUSH …
Run Code Online (Sandbox Code Playgroud)

c++ assembly compiler-optimization ollydbg dll-injection

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

在onClick上切换DIV高度

我想切换一个分区的高度。我尝试将.animate与if / else语句一起使用。但它只会反弹。我现在使用的代码将隐藏我的部门而不是切换高度。单击时将触发。

$(document).ready(function() {
       $("#content1").toggle(function(){
         $(this).animate({height:'400px'});
   }, function() {
         $(this).animate({height:'200px'});
   });
});
Run Code Online (Sandbox Code Playgroud)

我希望有人能找到答案,因为我无法在google / stackoverflow上找到答案。

html css jquery

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