我在.h文件中有以下类定义:
namespace N {
struct S {
S(); // no definition for member here
};
}
Run Code Online (Sandbox Code Playgroud)
我想在.cpp文件中为类构造函数(一般成员)编写定义.我考虑以下两种情况:
namespace N {
S::S() { /* definition */ }
}
Run Code Online (Sandbox Code Playgroud)using namespace N;
S::S() { /* definition */ }
Run Code Online (Sandbox Code Playgroud)我有点困惑为什么第二个工作根本就是因为从来没有看过这种方式直到今天.为什么第二个工作?一些引用标准的人将不胜感激.
使用一种方法而不是另一种方法有什么细微差别?我应该更喜欢第一种还是第二种形式?
我想计算一个持续时间的哪个部分包含在另一个持续时间中.还有的整数(6)标准执行,但它给了我0(由于整数divison)以下例子:
auto s = 1s;
auto ms = 200ms;
std::cout << ms / s; // 0, but I want 0.2 here
Run Code Online (Sandbox Code Playgroud)
是否有更优雅和通用的方法来计算这样的值而不是以下丑陋的解决方案?
#include <chrono>
#include <iostream>
int main()
{
using namespace std::chrono_literals;
auto s = 1s;
auto ms = 200ms;
const auto part = 1. * ms.count() / std::chrono::duration_cast<decltype(ms)>(s).count();
std::cout << part << '\n';
}
Run Code Online (Sandbox Code Playgroud)
一种聪明的方法是使用1. / (s / ms);,但它不适合任何持续时间类型.
clang-tidy [bugprone-in Correct-roundings]检查的文档说:
数字 0.499999975(小于 0.5 的最小可表示浮点数)四舍五入为 1.0
据我所知,下面的最小浮点数0.5是0.4999999702,而不是0.499999975。但尽管如此,这两个数字都给出了0朴素舍入计算中的值:
#include <iostream>
int main() {
const float v1 = 0.499999975;
const float v2 = 0.4999999702;
std::cout << (int)(v1+0.5) << "\n"
<< (int)(v2+0.5) << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
有没有办法,只使用C++ 03标准函数获得std::pair成员,即first或second?
在C++ 11中,我可以分别使用std::get<0>或者std::get<1>在这种情况下.
以下代码:
#define MYDEF(x)
#define MYDEF(y)
int main() {}
Run Code Online (Sandbox Code Playgroud)
给我一个错误(如果pedantic-errors禁用则发出警告):
"MYDEF"宏重新定义
原因是未使用的参数的名称不同(更多,宏中没有正文).但为什么?在哪些情况下它可能是一个问题?
c++ ×6
c ×1
c++-chrono ×1
c++03 ×1
clang-tidy ×1
macros ×1
namespaces ×1
rounding ×1
singleton ×1