小编tma*_*ric的帖子

警告:ISO C++禁止将字符串常量转换为'char*'以获取静态`constexpr char*`数据成员

为什么此代码会返回警告

警告:ISO C++禁止将字符串常量转换为'char*'[ - WRrite-strings]

如果

在对象声明或非静态成员函数中使用的constexpr说明符(直到C++ 14)暗示const.函数或静态成员变量(自C++ 17)声明中使用的constexpr说明符暗示内联.

(cppreference.com)

#include <cassert>    
#include <string>    
#include <iostream>    

struct A     
{    
    // warning: ISO C++ forbids converting a string constant to ‘char*’    
    static constexpr char* name_ = "A";                           
    static constexpr char* name() { return name_; };             
};                                             

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

如果我添加一个constconstexpr,警告消失了:

#include <cassert>    
#include <string>    
#include <iostream>   



struct A     
{    
    static constexpr const char* name_ = "A";    
    static constexpr const char* name() { return name_; }; …
Run Code Online (Sandbox Code Playgroud)

c++ static constexpr c++11

31
推荐指数
2
解决办法
6634
查看次数

如何衡量函数的调用开销?

我想测量和比较不同函数调用的开销.在处理扩展类的同时最小化代码修改的两种替代方法的意义上是不同的:

  • 使用抽象基类并在虚拟成员函数中提供实现
  • 使用策略宿主类并使用静态和成员函数定义不同的策略

将这两个选项与根本不调用任何函数进行比较.我也知道在设计支持动态多态的类时通常使用的NVI习惯用法 - 我使用的示例只是开销的基准.

这是我试图用于此目的的代码:

#include <iostream>
#include <vector>
#include <chrono>
#include <ctime>
#include <memory>

class Interface 
{
    public:
        virtual double calculate(double t) = 0; 
        virtual ~Interface() = default;

};

class Square
: 
    public Interface
{
    public:

       double calculate(double d)
       {
           return d*d;
       }

};

class SquareStaticFunction
{
    public:
        static double calculate(double d)
        {
            return d*d; 
        }
};

class SquareMemberFunction
{
    public:
        double calculate(double d)
        {
            return d*d; 
        }
};

template<typename Function>
class Generic
:
    public …
Run Code Online (Sandbox Code Playgroud)

c++ optimization c++11

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

是否可以在编译之前使用实例化模板查看C++代码(g ++)?

g ++编译器有一个生成宏扩展代码(-E)的标志,所以我想知道在实际编译发生之前是否有一种方法可以在模板实例化之后查看程序.

c++ templates g++ instantiation abstract-syntax-tree

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

如何在pandoc markdown中设置代码块的字体大小?

这个小例子:

An example code snippet:

~~~{.cpp}
class A 
{
    public:
        static void f1 () {}; 

        virtual void f2 () = override; 
};
~~~
Run Code Online (Sandbox Code Playgroud)

可用于生成PDF输出:

pandoc -o block-code.pdf block-code.txt
Run Code Online (Sandbox Code Playgroud)

导致

代码段和文本的字体大小相等.

代码和文本的字体大小相等.如何更改pdf(LaTex)pandoc输出的代码片段的字体大小?

latex pandoc

11
推荐指数
3
解决办法
5779
查看次数

自动返回类型扣除的警告:为什么我们需要在返回时定义类型的decltype?

这是关于如何对elementsSize()成员函数做什么的问题,关于自动返回类型推导:

#include <iostream>
#include <vector>

template<typename Element>
class ElementVector
{
    std::vector<Element> elementVec_;  

    // Other attributes.

    public: 

        ElementVector() = default; 

        ElementVector(const std::initializer_list<Element>& list)
            :
                elementVec_(list)
        {}

        auto elementsSize() // -> decltype(elementVec_size()) 
        {
            return elementVec_.size(); 
        }
};

using namespace std;

int main(int argc, const char *argv[])
{
    ElementVector<double> e = {1.2, 1.3, 1.4, 1.5};  

    cout << e.elementsSize() << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码导致编译器警告(gcc 4.8.2):

main.cpp:20:27: warning: ‘elementsSize’ function uses ‘auto’ type specifier without trailing return type [enabled by default]
         auto elementsSize() // …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

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

为什么循环展开对大型数据集没有影响?

我想对未应用的循环和应用于triangle对象的for循环之间的执行速度差异进行基准测试.整个示例可在此处获得.

这是完整的代码:

#include <iostream>
#include <vector>
#include <array>
#include <random>
#include <functional>
#include <chrono>
#include <fstream>

template<typename RT>
class Point 
{
    std::array<RT,3> data; 

    public: 

        Point() = default;

        Point(std::initializer_list<RT>& ilist)
            :
                data(ilist)
        {}

        Point(RT x, RT y, RT z)
            :
                data({x,y,z})
        {};

        RT& operator[](int i)
        {
            return data[i];  
        }

        RT operator[](int i) const
        {
            return data[i];
        }

        const Point& operator += (Point const& other)
        {
            data[0] += other.data[0];
            data[1] += other.data[1];
            data[2] += other.data[2];

            return *this; 
        } …
Run Code Online (Sandbox Code Playgroud)

c++ optimization loop-unrolling

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

std :: typeid :: name()的奇怪输出

我曾经使用typeid以下代码(cppreference)获取std :: vector :: size_type的类型名称和零大小的类A.

#include<iostream>
#include <vector>
#include <typeinfo>

using namespace std;

class A {};

int main()
{
    vector<int> v(10); 

    vector<int>::size_type s = v.size(); 

    A a; 

    cout << typeid(s).name() << endl;
    cout << typeid(a).name() << endl;

};
Run Code Online (Sandbox Code Playgroud)

我把它作为输出:

m
1A
Run Code Online (Sandbox Code Playgroud)

我猜"A"之前的"1"是空基类优化的结果,但"m"代表什么,这是正常的吗?

我使用以下gcc版本:g ++(Ubuntu 4.4.3-4ubuntu5.1)4.4.3

c++ typeinfo

8
推荐指数
1
解决办法
4028
查看次数

如何才能使git列表只包含文件夹中的跟踪目录?

使用git list-files提供了我在其中跟踪的目录和文件.有这样的命令:

git list-directories
Run Code Online (Sandbox Code Playgroud)

或类似的东西,只列出跟踪的非空非递归目录名称?

git

8
推荐指数
1
解决办法
5548
查看次数

如何在 Jupyter Lab 的 Markdown 笔记本中启用方程编号?

Jupyter 笔记本支持方程编号,但我在使用 Juyter Lab 的 Markdown 笔记本中使用的 LaTex 生成方程编号时遇到困难。此功能是否可用?如果可用,我该如何使其发挥作用?

markdown jupyter-notebook jupyter-lab

8
推荐指数
1
解决办法
3045
查看次数

如何使用智能指针作为类属性来复制对象?

boost库文档中我读到了这个:

从概念上讲,智能指针被视为拥有指向的对象,因此在不再需要时负责删除对象.

我有一个非常简单的问题:我想使用RAII作为可复制和可分配类的指针属性.

复制和赋值操作应该很深:每个对象都应该有自己的实际数据副本.此外,RTTI需要可用于属性(它们的类型也可以在运行时确定).

我应该搜索可复制智能指针的实现(数据很小,所以我不需要复制写入指针),或者我是否将复制操作委托给我的对象的复制构造函数,如本答案所示?

我可以选择哪种智能指针用于可复制和可分配的类的简单RAII?(我认为带有委托复制/赋值操作的unique_ptr到类复制构造函数和赋值运算符会做出正确的选择,但我不确定)

这是使用原始指针的问题的伪代码,它只是一个问题描述,而不是正在运行的C++代码:

// Operation interface
class ModelOperation
{
    public: 
        virtual void operate = (); 
};

// Implementation of an operation called Special 
class SpecialModelOperation
:
    public ModelOperation
{
    private:
        // Private attributes are present here in a real implementation. 

    public: 

        // Implement operation
        void operate () {}; 
};

// All operations conform to ModelOperation interface
// These are possible operation names: 
// class MoreSpecialOperation; 
// …
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers copy-constructor assignment-operator

7
推荐指数
2
解决办法
5384
查看次数