我读了dcmtk源代码,并在ofstdinc.h中找到了注释:
// this file is not and should not be protected against multiple inclusion
Run Code Online (Sandbox Code Playgroud)
什么样的头文件不应该被保护免受多重包含?
据我所知,重载函数必须包含不同的参数(类型或计数).所以我认为模板函数不应该只基于返回类型.但是以下代码可以使用GCC 6.3.0.
#include <iostream>
using namespace std;
template<typename T>
T add(double a, double b)
{
return static_cast<T>(a + b);
}
int main()
{
cout << add<int>(1.1, 1) << endl;
cout << add<double>(1.1, 1) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
构建并运行:
g++ -g -o test test.cpp
./test
2
2.1
Run Code Online (Sandbox Code Playgroud)
剂量C++标准澄清了这一点?谢谢!
在Effective Modern C++ item 12 中,有一个关于C++11 函数的引用限定符的示例代码:
class Widget {
public:
using DataType = std::vector<double>;
…
DataType& data() & // for lvalue Widgets
{ return values; } // return lvalue
DataType data() && // for rvalue Widgets
{ return std::move(values); } // return rvalue
…
private:
DataType values;
};
Run Code Online (Sandbox Code Playgroud)
那么为什么第二个data() 右值引用重载函数返回一个临时对象 DataType而不是一个右值引用 DataType&&呢?
没有初始化的变量的默认值是多少enum class?以下代码打印奇怪的结果。
#include <iostream>
#include <cstdio>
using namespace std;
struct C {
C() {
m_a = 1;
}
enum class E:bool {
a = false,
b = true,
};
int m_a;
E m_e;
};
int main()
{
C c;
cin >> c.m_a;
printf("m_e: %d; compare to C::E::a: %d\n", static_cast<int>(c.m_e), c.m_e == C::E::a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc版本9.4.0构建(Ubuntu 9.4.0-1ubuntu1~20.04.1)
g++ -g -o c c.cpp
# run, input 1 and get the result.
./c
1
m_e: 252; compare to C::E::a: …Run Code Online (Sandbox Code Playgroud)