这是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) 这是关于这个的第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.
如果有人用标准引用确认答案,那就太好了.
为什么三元运算符会阻止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) 我有一个功能:
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++标准对基本整数类型的范围的影响.在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:这个问题与此处给出的副本不同.关联的问题是为什么标准中没有强制执行两个补码.我的问题是关于实际标准中的内容.
如果没有(因为标题中定义了这个错误),new程序中的表达式如何抛出错误是怎么回事?bad_alloc#include <new><new>
从3.7.4开始.N3337:
该库提供全局分配和释放功能的默认定义.一些全局分配和释放功能是可替换的(18.6.1).C++程序最多只能提供一个可替换分配或释放功能的定义.任何此类函数定义都将替换库中提供的默认版本(17.6.4.6).以下分配和释放函数(18.6)在程序的每个转换单元中在全局范围中隐式声明.
Run Code Online (Sandbox Code Playgroud)void* operator new(std::size_t); void* operator new[](std::size_t); void operator delete(void*); void operator delete[](void*);这些隐含的声明只介绍了函数名
operator new,operator new[],operator delete,和operator delete[].[ 注:隐式声明不引入名称std,std::size_t或该库使用来声明这些名称的任何其他名称.因此,在不包括头部的情况下引用这些函数之一的新表达式,删除表达式或函数调用<new>是格式良好的.但是,除非通过包含适当的标题声明了名称,否则引用std或std::size_t形成不良.-end note ]也可以为任何类声明和定义分配和/或释放函数
这仍然不清楚.隐式声明使用std::size_t但不引入它们(同样必须是这样bad_alloc)?并且std::size_t在new表达式可以使用之前不需要引入?可以理解这是怎么回事,或者我必须从表面上看它?
我无法得到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) 作为标题,我不知道std::__lg在谷歌之后是什么意思?这行到底是做什么的:int n = std::__lg(block_sz - pos_l + 1);
在下面的成员函数声明中,我无法理解为什么在同一个声明中有两个函数what()和throw()?这是什么意思?我是c ++的初学者,我可能没有研究过这个概念.请帮帮我或指出我必须阅读的材料.
virtual const char* what() const throw() {}
Run Code Online (Sandbox Code Playgroud) 我有一个方法的指针:
struct A { int method() { return 0; } };
auto fn = &A::method;
Run Code Online (Sandbox Code Playgroud)
我能获得通过的std ::的result_of返回类型,但我怎样才能从中获取FN方法的类老板?