小编Mic*_*ael的帖子

为什么C++不允许函数参数用于默认值后面的参数?

这是对这个问题的后续跟进.OP问题中的代码看起来非常合理且对我来说毫不含糊.为什么C++不允许使用以前的参数来定义后面的参数的默认值,如下所示:

int foo( int a, int b = a );
Run Code Online (Sandbox Code Playgroud)

此外,至少在C++ 11中,声明的参数类型可用于确定返回类型,因此以类似的方式使用函数参数并非闻所未闻:

auto bar( int a ) -> decltype( a );
Run Code Online (Sandbox Code Playgroud)

因此,问题是:为什么foo不允许上述声明的原因是什么?

c++ language-lawyer default-parameters

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

动态 - 数学 - 数学

是否可以在运行时选择性地打开/关闭-ffast-math?例如,使用公共基类Math创建类FastMath和AccurateMath,以便一个人能够在运行时使用这两个实现?将次正常闪烁归零等同样如此.

特别是,我不知道使用-ffast-math进行编译是否会发出一条指令,该指令一旦执行就会影响线程中的所有数值计算(例如,设置一个标志以将subnormals刷新为零).

c optimization performance gcc fast-math

6
推荐指数
2
解决办法
979
查看次数

区分模板中的整数和浮点类型

我想对几种整数类型(16,32,64位)和浮点类型(float,double,long double)执行类似但不相同的计算.大多数代码都是相同的,但是对于整数和浮点数,某些部分需要以不同的方式完成.例如,比较int可以用a == b来完成,而比较浮点数应该用abs(ab)来完成

一种方法是将整数和浮点之间不同的代码部分隔离成小函数,并为每种类型专门化模板.但是,我宁愿不为每个整数类型复制粘贴相同的代码,也不为每个浮点类型复制粘贴相同的代码.因此问题是:是否可以同时为多种类型专门化模板功能?如果它是合法的,在语义上类似于以下内容:

template<>
bool isEqual< short OR long OR long long >( T a, T b ) { 
    return a == b;
}

template<>
bool isEqual< float OR double OR long double >( T a, T b ) { 
    return abs( a - b ) < epsilon;
}
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

在C++中从container.end()中减去是否安全?

也就是说,提供container不是空的,我可以安全地执行此操作:

std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;
Run Code Online (Sandbox Code Playgroud)

还有这个:

编辑:替换-1--:

std::list<int> container;
container.insert( 0xFACE8D );
auto last = container.end();
--last;
Run Code Online (Sandbox Code Playgroud)

再次为任意非空容器?

编辑:让我澄清一下这个问题.

有时完全合法的代码行为不正确.问题是:假设上面的代码编译,这样做是否安全?

对于普通的C风格数组应该是安全的,因为相应的迭代器只是指针.但对于更复杂的容器是否安全?

假设一个实现带有这样的迭代器的列表:

class MyListIterator {
    MyListIterator *prev, *next;
    MyListIterator * operator--() { return prev; }
    ...
};

class MyList {
    MyListIterator *end() { return NULL; }
    ...
}; 
Run Code Online (Sandbox Code Playgroud)

然后尝试减少container::end(),尽管在语法上完全合法,将导致段错误.

不过,我希望stl容器比这更聪明.因此,关于上述stl::list代码行为的保证的问题,如果有的话.

c++ iterator stl language-lawyer

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

启动 QProcess 并一次读取一行输出

Qt 中读取子进程输出一行的首选方式是什么?

我尝试将 QProcess 信号 readyReadStandardOutput 连接到调用 QProcess 方法 readLine 的函数。

c++ qt

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

是否可以在运行时重载函数?

我想简化一个包含大约一百个这样的表达式的代码:

if( flag )
    AddData( key, some_number );
else
    AddData( key, error_description );
Run Code Online (Sandbox Code Playgroud)

AddData被重载的地方

bool AddData( int key, double value );
bool AddData( int key, const char * error );
Run Code Online (Sandbox Code Playgroud)

我想像上面这样表达上面的代码:

AddData( key, flag? some_number : error_description );
Run Code Online (Sandbox Code Playgroud)

当然,它不会编译,因为标志的值是在运行时确定的,而AddData签名需要在编译时确定.

将两种功能组合成类似的东西

bool AddData( int key, bool flag, double value, const char * error );
Run Code Online (Sandbox Code Playgroud)

并解决使用哪些参数以及忽略哪一个参数,但它看起来不够漂亮.

因此问题是:是否有可能以更合理的方式在运行时解决函数重载?

c++ overloading

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

在同一个项目中混合使用C++风格

在同一个项目中混合使用C++ 98和C++ 11是否安全?通过"混合",我的意思不仅是链接目标文件,还包括用C++ 98和C++ 11编译的源代码中包含的公共头文件.

该问题的背景是希望将大型代码库的至少一部分转换为C++ 11.代码的一部分在C++ CUDA中,编译为在GPU或CPU上执行,并且相应的编译器此时不支持C++ 11.但是,许多代码仅用于CPU,可以使用C++编译.某些头文件包含在CPU + GPU和仅CPU源文件中.

如果我们现在使用C++ 11编译器编译仅CPU的源文件,我们是否可以对不良副作用有信心?

c++ compatibility cuda compilation c++11

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

是否可以在代码的一部分上运行valgrind?

我有一个内存泄漏发生在一个相当大的系统的已知部分.我想全速运行直到该部分代码,在该部分运行valgrind memcheck,并在所述部分结束时收集valgrind memcheck报告,而不进一步完成运行.那可能吗?

c++ valgrind memory-leaks

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

怎么判断我有什么要推的?

要知道我是否有任何东西,pull我这样做:

git fetch --dry-run --verbose
Run Code Online (Sandbox Code Playgroud)

我怎么能提醒自己我是否有任何东西push

git

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

成为`stl`算法兼容容器需要什么?

1)对于给定的stl算法,如何找出为了使用所述容器需要实现的自定义容器/迭代器功能?

2)需要实现什么才能使容器与所有stl算法完全兼容?

c++ stl

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