小编Mar*_*k B的帖子

为什么从C++ 11中删除了std :: pow(double,int)?

在研究计算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)版本提供了一个很好的优化机会,所以它们被删除似乎很奇怪.编译器是否仍然符合标准以提供这样的优化过载?

c++ c++-standard-library c++11

63
推荐指数
1
解决办法
1万
查看次数

C++ - 在头文件中使用构造函数初始化变量

关于以下内容,是否有任何理由做一个或另一个或大致等同?

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)

c++ constructor initialization

35
推荐指数
4
解决办法
4万
查看次数

初始化枚举的值的行为

首先,我想说,根据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

33
推荐指数
1
解决办法
7344
查看次数

如何创建类似printf变量参数的函数

我正在寻找为我的日志记录实现api like printf.它应该类似于调用printf.例如:

persistent_log(LogType0, "This is buffered writing %d", i);
Run Code Online (Sandbox Code Playgroud)

我查看了变量参数的内容,但似乎我需要知道那里的参数的数量和类型.所以我需要在这方面提供更多帮助.

c

19
推荐指数
1
解决办法
2万
查看次数

为什么boost包含两个不同版本的strong_typedef.hpp?

在我最近建立一个项目时,我注意到有一个关于BOOST_STRONG_TYPEDEF重新定义的宏的编译器警告(转向错误).经过进一步调查,我注意到strong_typedef.hppboost 中有两个不同的版本:一个位于顶层,一个位于顶层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)

为什么有两个不同版本的宏,哪一个作为实现更有意义?将强制内置类型初始化的那个,或者不强制内置类型的那个(尽可能地模仿基础类型强类型化)?

c++ boost

14
推荐指数
2
解决办法
1382
查看次数

如何从stdin编译代码?

代码很简单:

test$ cat test.cpp

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

有没有办法编译来自标准输出的代码?

我试过这个:

cat test.cpp | g++ -
Run Code Online (Sandbox Code Playgroud)

和一些变化,但没有产生可执行文件.


只是一些澄清.我有一个程序预处理文件,并生成另一个我想编译的文件.我想过不创建这个中间文件,而是直接生成目标文件.

c++ linux gcc

13
推荐指数
1
解决办法
6228
查看次数

具有价值语义的表现

我非常关注代码的性能和可读性,我从Google的Chandler Carruth那里得到了我的大部分想法.我想在不丢失性能的情况下为C++应用以下规则来实现干净的代码.

  • 将所有内置类型作为值传递
  • 传递所有不想通过const引用变异的对象
  • 传递函数需要按值消耗的所有对象
  • 禁止其他一切.在拐角情况下,传递指针.

这样,功能没有副作用.这是代码可读性的必要条件,并使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个动作.这是我的问题:

  • 这是合法的C++ 11吗?
  • 你认为这个设计有什么缺点吗?
  • 编译器无法自动将v = f(v)转换为此?一种复制省略.

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)

c++ move c++11

11
推荐指数
1
解决办法
505
查看次数

为什么g ++和MS Visual Studio C++以不同的方式执行以下代码?

我无法理解哪个编译器在这里有问题(如果有的话).与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)

c++ alias reference const-correctness

9
推荐指数
1
解决办法
532
查看次数

让std :: map allocator工作

我有一个非常基本的分配器:

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)

c++ stl allocator

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

std :: forward_list - 如何在末尾插入元素

forward_list是单个链表(与标准列表容器不同).list具有在前面和后面插入的功能,但forward_list没有在后面插入元素的功能(类似于push_back).为什么不能在列表后面插入元素?

c++ stl c++11

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