在研究计算p ^ q(指数)的有效方法时,其中q是一个整数并且回顾了C++ 98和C++ 11标准,我注意到std::pow(double, int)
在C++ 11 中显然已经消除了重载.
在C++ 98 26.5/6中它有double pow(double, int);
签名.
在C++ 11 26.8所有我能找到的是重载采取一对float
,double
或者long double
和一个明确的注意,在参数类型积分和双重的混合物的情况下,在pow(double, double)
过载应挑选.
这只是对前一个意图的澄清,如果它们在C++ 98中被错误地添加了,它们是否真的在C++ 11中删除了,还是别的?
显然,该pow(double, int)
版本提供了一个很好的优化机会,所以它们被删除似乎很奇怪.编译器是否仍然符合标准以提供这样的优化过载?
关于以下内容,是否有任何理由做一个或另一个或大致等同?
class Something
{
int m_a = 0;
};
Run Code Online (Sandbox Code Playgroud)
VS
class Something
{
int m_a;
Something(int p_a);
};
Something::Something(int p_a):m_a(p_a){ ... };
Run Code Online (Sandbox Code Playgroud) 首先,我想说,根据cppreference.com,对枚举值进行初始化是不可能的.
根据http://en.cppreference.com/w/cpp/language/value_initialization,初始化枚举值实际上执行零初始化.然后,根据http://en.cppreference.com/w/cpp/language/zero_initialization,零初始化枚举的效果是:
如果
T
是标量类型,则对象的初始值是隐式转换为的整数常量零T
.
但是,整数常数零不能隐式转换为枚举.最终,枚举不能进行价值初始化.这听起来很奇怪,并且枚举值的初始值确实适用于VC,GCC和clang.那么,标准对此有何看法?
其次,根据http://en.cppreference.com/w/cpp/language/static_cast:
整数,浮点或枚举类型可以转换为任何完整的枚举类型(结果是未指定的(直到C++ 17)未定义的行为(自C++ 17)如果表达式的值转换为枚举的基础类型,不是目标枚举值之一)
那么,这是否意味着如果目标枚举没有枚举器等于,则初始化枚举值(如果它可以工作)可能实际上导致未定义的行为0
?
c++ enums initialization language-lawyer value-initialization
我正在寻找为我的日志记录实现api like printf.它应该类似于调用printf.例如:
persistent_log(LogType0, "This is buffered writing %d", i);
Run Code Online (Sandbox Code Playgroud)
我查看了变量参数的内容,但似乎我需要知道那里的参数的数量和类型.所以我需要在这方面提供更多帮助.
在我最近建立一个项目时,我注意到有一个关于BOOST_STRONG_TYPEDEF
重新定义的宏的编译器警告(转向错误).经过进一步调查,我注意到strong_typedef.hpp
boost 中有两个不同的版本:一个位于顶层,一个位于顶层serialization/
.
两个版本之间实际上也存在差异,而不仅仅是宏的重复版本.T
在序列化版本执行时,顶级版本没有显式地为value-init ;
代码剪辑:
boost/strong_typedef.hpp
:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(){}; \
D(const D & t_) : t(t_.t){} \
Run Code Online (Sandbox Code Playgroud)
boost/serialization/strong_typedef.hpp
:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(): t() {}; \
D(const D & t_) : t(t_.t){} \
Run Code Online (Sandbox Code Playgroud)
为什么有两个不同版本的宏,哪一个作为实现更有意义?将强制内置类型初始化的那个,或者不强制内置类型的那个(尽可能地模仿基础类型强类型化)?
代码很简单:
test$ cat test.cpp
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
有没有办法编译来自标准输出的代码?
我试过这个:
cat test.cpp | g++ -
Run Code Online (Sandbox Code Playgroud)
和一些变化,但没有产生可执行文件.
只是一些澄清.我有一个程序预处理文件,并生成另一个我想编译的文件.我想过不创建这个中间文件,而是直接生成目标文件.
我非常关注代码的性能和可读性,我从Google的Chandler Carruth那里得到了我的大部分想法.我想在不丢失性能的情况下为C++应用以下规则来实现干净的代码.
这样,功能没有副作用.这是代码可读性的必要条件,并使C++成为一种功能.现在来了表现.如果你想编写一个为std :: vector的每个元素添加1的函数,你能做什么?这是我的解决方案.
std::vector<int> add_one(std::vector<int> v) {
for (std::size_t k = 0; k < v.size(); ++k) {
v[k] += 1;
}
return v;
}
...
v = add_one(std::move(v));
...
Run Code Online (Sandbox Code Playgroud)
我发现这非常优雅,只有2个动作.这是我的问题:
PS:人们问我为什么不喜欢通过参考.我有两个参数:
1 - 它没有在调用站点明确指出哪个参数可能会发生变异.
2 - 它有时会扼杀性能.由于别名,引用和指针是编译器的地狱.我们来看下面的代码
std::array<double, 2> fval(const std::array<double, 2>& v) {
std::array<double, 2> ans;
ans[0] = cos(v[0] + v[1]);
ans[1] = sin(v[0] + v[1]);
return ans;
}
Run Code Online (Sandbox Code Playgroud)
将ans作为参考的相同代码慢了2倍:
std::array<double, 2> fref(const std::array<double, 2>& v,
std::array<double, …
Run Code Online (Sandbox Code Playgroud) 我无法理解哪个编译器在这里有问题(如果有的话).与MS Visual Studio C++相比,以下代码与g ++不同.
#include <iostream>
int main() {
int a = 10; //some random value
int* ptr = &a;
//a temp rvalue of type `const int* const' created in g++
//no temp created in MS Visual Studio
const int* const &alias_for_ptr = ptr;
ptr = 0; //null ptr
if (ptr == alias_for_ptr)
//This will execute in MS Visual Studio C++
//But not in g++
std::cout << "ptr == alias_for_ptr" << std::endl;
else
//This will execute in g++
//But …
Run Code Online (Sandbox Code Playgroud) 我有一个非常基本的分配器:
template<typename T>
struct Allocator : public std::allocator<T> {
inline typename std::allocator<T>::pointer allocate(typename std::allocator<T>::size_type n, typename std::allocator<void>::const_pointer = 0) {
std::cout << "Allocating: " << n << " itens." << std::endl;
return reinterpret_cast<typename std::allocator<T>::pointer>(::operator new(n * sizeof (T)));
}
inline void deallocate(typename std::allocator<T>::pointer p, typename std::allocator<T>::size_type n) {
std::cout << "Dealloc: " << n << " itens." << std::endl;
::operator delete(p);
}
template<typename U>
struct rebind {
typedef Allocator<U> other;
};
};
Run Code Online (Sandbox Code Playgroud)
当我使用它时,它工作正常:"std :: vector>",但是,当我尝试将它与std :: map一起使用时:
int main(int, char**) …
Run Code Online (Sandbox Code Playgroud) forward_list是单个链表(与标准列表容器不同).list具有在前面和后面插入的功能,但forward_list没有在后面插入元素的功能(类似于push_back).为什么不能在列表后面插入元素?