小编Chr*_*ckl的帖子

为什么在很多C++标准库代码中将不等式测试为(!(a == b))?

这是C++标准库remove代码中的代码.为什么不平等测试if (!(*first == val))而不是if (*first != val)

 template <class ForwardIterator, class T>
      ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
 {
     ForwardIterator result = first;
     while (first!=last) {
         if (!(*first == val)) {
             *result = *first;
             ++result;
         }
         ++first;
     }
     return result;
 }
Run Code Online (Sandbox Code Playgroud)

c++

142
推荐指数
5
解决办法
9813
查看次数

使用自己的数据成员聚合结构的初始化

这是关于这个的第n个问题,但我找不到完全相同的...

假设以下代码:

#include <iostream>

struct S {
    int x;
    int y;
};

class C {
public:
    S s;
    C() : s{123, s.x} {}
};

int main() {
     std::cout << C().s.y << '\n';
}
Run Code Online (Sandbox Code Playgroud)

可以s.y像这样初始化吗?(只有JetBrains的ReSharper通过以下方式抱怨它:) Object member this->s.x might not be initialized.

如果有人用标准引用确认答案,那就太好了.

c++ aggregate-initialization

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

为什么三元运算符会阻止返回值优化?

为什么三元运算符会阻止MSVC中的返回值优化(RVO)?考虑以下完整的示例程序:

#include <iostream>

struct Example
{
    Example(int) {}
    Example(Example const &) { std::cout << "copy\n"; }
};

Example FunctionUsingIf(int i)
{
    if (i == 1)
        return Example(1);
    else
        return Example(2);
}

Example FunctionUsingTernaryOperator(int i)
{
    return (i == 1) ? Example(1) : Example(2);
}

int main()
{
    std::cout << "using if:\n";
    Example obj1 = FunctionUsingIf(0);
    std::cout << "using ternary operator:\n";
    Example obj2 = FunctionUsingTernaryOperator(0);
}
Run Code Online (Sandbox Code Playgroud)

使用VC 2013编译如下: cl /nologo /EHsc /Za /W4 /O2 stackoverflow.cpp

输出:

using if:
using ternary operator: …
Run Code Online (Sandbox Code Playgroud)

c++

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

如何禁止函数指针参数的NULL值

我有一个功能:

void foo(int parm11, pointer to function) {...}
Run Code Online (Sandbox Code Playgroud)

我想禁止用NULL第二个参数的值来调用它.换句话说,我想从以下C++源代码行的编译器获取错误消息:

foo(5, NULL);
Run Code Online (Sandbox Code Playgroud)

c++

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

C++标准强加的整数范围

这个问题是关于C++标准对基本整数类型的范围的影响.在C++ 17标准中,6.9.1关于基本类型的观点有一个点4,它表示:

无符号整数应遵守算术模数的定律,2^n 其中n是该特定整数大小的值表示中的位数.

在C标准中,它只表示if [0, max]是可以用无符号整数表示的范围,超出此范围的所有操作都以模数减少range + 1.它永远不会说range + 1应该是2的力量.

这个C++标准的引用是否意味着所有无符号整数都有这样的范围[0, 2^n - 1]?我们可以从那一点推断出所有有符号整数都有一个范围的形式[-2^(n/2), 2^(n/2) - 1]吗?

我在标准中没有看到任何说法,但之前引用的标准似乎暗示了那种事情.


PS:这个问题与此处给出的副本不同.关联的问题是为什么标准中没有强制执行两个补码.我的问题是关于实际标准中的内容.

c++

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

尽管没有定义<new>标头,但新抛出bad_alloc?

如果没有(因为标题中定义了这个错误),new程序中的表达式如何抛出错误怎么回事?bad_alloc#include <new><new>

从3.7.4开始.N3337:

该库提供全局分配和释放功能的默认定义.一些全局分配和释放功能是可替换的(18.6.1).C++程序最多只能提供一个可替换分配或释放功能的定义.任何此类函数定义都将替换库中提供的默认版本(17.6.4.6).以下分配和释放函数(18.6)在程序的每个转换单元中在全局范围中隐式声明.

void* operator new(std::size_t);

void* operator new[](std::size_t);

void operator delete(void*);

void operator delete[](void*);
Run Code Online (Sandbox Code Playgroud)

这些隐含的声明只介绍了函数名operator new,operator new[],operator delete,和operator delete[].[ 注:隐式声明不引入名称std,std::size_t或该库使用来声明这些名称的任何其他名称.因此,在不包括头部的情况下引用这些函数之一的新表达式,删除表达式或函数调用<new>是格式良好的.但是,除非通过包含适当的标题声明了名称,否则引用stdstd::size_t形成不良.-end note ]也可以为任何类声明和定义分配和/或释放函数

这仍然不清楚.隐式声明使用std::size_t但不引入它们(同样必须是这样bad_alloc)?并且std::size_tnew表达式可以使用之前不需要引入?可以理解这是怎么回事,或者我必须从表面上看它?

c++ bad-alloc c++11

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

STL std :: remove_if编译失败

我无法得到std :: remove_if进行编译,因为你可以看到我选择了一种工作正常的替代手动曲柄方法,编译器错误位于代码之后的列表底部.

任何帮助将非常感激.

谢谢,汤姆

#include <iostream>
#include <fstream>
#include <set>
#include <algorithm>
#include <string>

//
// Find the largest compound word composed
// of sub-words from a list.
//
// - read list from file. 
//
// Psuedo Code:
//
// 1. Read Next Word from File.
// 2. Search in list for word formed from word.
// 3. if Found in List
// 4.   if Found Compound is longer then Current Compound
// 5.     Replace
// 6.     Remove …
Run Code Online (Sandbox Code Playgroud)

c++ stl c++11

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

什么是 std::__lg?

作为标题,我不知道std::__lg在谷歌之后是什么意思?这行到底是做什么的:int n = std::__lg(block_sz - pos_l + 1);

c++ std

5
推荐指数
2
解决办法
4343
查看次数

两个函数,what()和throw(),在同一个声明中?

在下面的成员函数声明中,我无法理解为什么在同一个声明中有两个函数what()和throw()?这是什么意思?我是c ++的初学者,我可能没有研究过这个概念.请帮帮我或指出我必须阅读的材料.

virtual const char* what() const throw() {}
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
0
解决办法
57
查看次数

如何从指针到方法获取类(对象类型)

我有一个方法的指针:

struct A { int method() { return 0; } };
auto fn = &A::method;
Run Code Online (Sandbox Code Playgroud)

我能获得通过的std ::的result_of返回类型,但我怎样才能从中获取FN方法的类老板?

c++ metaprogramming c++14

5
推荐指数
2
解决办法
763
查看次数