小编Pap*_*ter的帖子

C和C++中的可变长度数组(VLA)

可能重复:
文件范围内可变修改的数组

我有一些关于VLA及其行为的概念,我需要澄清一下.

自C99起AFIK可以将VLA声明为本地范围:

int main(int argc, char **argv)
{
    // function 'main' scope
    int size = 100;
    int array[size];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它在全球范围内被禁止:

const int global_size = 100;
int global_array[global_size]; // forbidden in C99, allowed in C++

int main(int argc, char **argv)
{
    int local_size = 100;
    int local_array[local_size];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在C99中声明了一个VLA,因为const修饰符不会创建编译时值.在C++中global_size是一个编译时值,因此,global_array不会成为VLA.

我需要知道的是:我的推理是否正确?我描述的行为是正确的吗?

我也想知道:为什么不允许全球范围内的VLA?在C和C++中是否被禁止?数组在全局和局部范围内的行为有什么不同?

c c++ arrays variable-length-array

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

Autoindenting无法在vim中运行?

我目前正在使用vim并且希望每次我需要自动添加(例如在javascript之后或在Python中冒号之后).出于某种原因,我尝试了autoindent和smartindent,但每个新行给了我2个标签而不是一个.它为什么这样做?我以为它只会插入一个标签.

我当前的〜/ .vimrc文件有:

    set ts=4
    set autoindent
    set smartindent
    filetype plugin indent on
Run Code Online (Sandbox Code Playgroud)

vim indentation

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

从已删除复制构造函数的类继承

我有一个类base只包含私有默认构造函数和公共删除的复制构造函数,没有别的.

class base {
private:
    base() = default;

public:
    base(const base&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

如果我尝试继承base并创建类的实例,derived如下所示,g ++ 4.8.2不会编译我的代码,但VC++ 2013会编译.

class derived : public base {
private:
    derived() = default;
};

derived x;
Run Code Online (Sandbox Code Playgroud)

那么,它是g ++或VC++ 2013中的一个错误,只是忽略了什么?

这是完整的代码......

class base {
private:
    base() = default;

public:
    base(const base&) = delete;
};

class derived : public base {
private:
    derived() = default;
};

derived x;

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

...和g ++错误消息.

main.cpp:12:5: error: 'constexpr derived::derived()' is private
     derived() …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-bug c++11 visual-studio-2013 g++4.8

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

如何在拖动操作期间取消Android中的View.OnDragListener?

view.startDrag()用来开始拖动操作.在拖动时,会收到事件OnDragListener.我也DragShadowBuilder用来显示View B拖动时的最后一张图像.

有没有办法停止或取消或中止某些外部事件或操作的拖动?例如,有2个视图,View A并且View B,我拖View BView A.在拖动时,由于某些外部事件或操作,我想取消拖动操作或取消OnDragListener(不移除我的手指view B).

代码段DragShadowBuilder:

DragShadowBuilder shadowBuilder = new DragShadowBuilder(view) {
    @Override
    public void onDrawShadow(Canvas canvas) {
        canvas.drawBitmap(b, 0, 0, new Paint());
        super.onDrawShadow(canvas);
    }
};
boolean dragSuccess = false;
dragSuccess = view.startDrag(null, shadowBuilder, view, 0);
Run Code Online (Sandbox Code Playgroud)

代码段OnDragListener:

private final class ViewDragListener implements OnDragListener {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        int …
Run Code Online (Sandbox Code Playgroud)

android drag-and-drop

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

运行时大小的数组和指针衰减

type_traits在新的C++ 14运行时大小的数组上测试了标题中的一些工具,请考虑以下代码:

int g[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

template <typename T> void print(T &t)
{
    std::cout << "Type id:    " << typeid(T).name() << '\n';
    std::cout << "is_array:   " << std::is_array<decltype(T)>::value << '\n';
    std::cout << "is_pointer: " << std::is_pointer<decltype(T)>::value << '\n';
    std::cout << "extent:     " << std::extent<decltype(T)>::value << '\n';
}

int main()
{
    print(g);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

静态大小的数组g返回以下输出:

Type id:    A11_i
is_array:   1
is_pointer: 0
extent:     11
Run Code Online (Sandbox Code Playgroud)

A11_i我假设 unmangled …

c++ arrays variable-length-array c++14

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

正则表达式与所有组件选项,如何避免空匹配

我必须处理一个逗号分隔的字符串,其中包含三元组值并将它们转换为运行时类型,输入如下所示:

"1x2y3z,80r160g255b,48h30m50s,1x3z,255b,1h,..."
Run Code Online (Sandbox Code Playgroud)

所以每个子字符串都应该这样转换:

"1x2y3z"      should become Vector3 with x = 1,  y = 2,   z = 3
"80r160g255b" should become Color   with r = 80, g = 160, b = 255
"48h30m50s"   should become Time    with h = 48, m = 30,  s = 50
Run Code Online (Sandbox Code Playgroud)

我现在面临的问题是,所有的组件都是可选的(但他们维持秩序),所以下面的字符串也是有效的Vector3,ColorTime值:

"1x3z" Vector3 x = 1, y = 0, z = 3
"255b" Color   r = 0, g = 0, b = 255
"1h"   Time    h = 1, m …
Run Code Online (Sandbox Code Playgroud)

c++ regex c++11

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

静态运算符 () 和 [] (C++23)

operator ()引入了和的静态版本operator []

\n
#include <iostream>\n#include <format>\n\nstruct S\n{\n    static int operator()(int a, int b) { return a + b; }\n    static int operator[](int a, int b) { return a - b; }\n};\n\nint main()\n{\n    std::print("({})[{}]", S{}(1, 0), S{}[3, 1]); // (1)[2]\n//                          ^^         ^^ <-- Create temporary instances of \'S\'?!\n    std::print("({})[{}]", S()(2, 1), S()[5, 1]); // (3)[4]\n//                          ^^         ^^ <-- Create temporary instances of \'S\'?!\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

令我震惊的是,为了调用静态版本的运算符()[]需要类的实例;我期望能够从类型中调用两个运算符(作为其他静态成员),但它的格式不正确:

\n
//            type …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading language-lawyer c++23

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

如何声明两个类,使A有B和B的成员将A的成员标记为朋友?

我试图从C++ Primer第5版开始练习7.32.该练习要求如下:

定义你自己的版本Screen,并Window_mgr在其中clear的成员Window_mgr和朋友Screen.

下面是定义Screen,Window_mgrclear在文中给出.

class Screen
{
  public:
    using pos = std::string::size_type;
    Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) { }
  private:
    pos height = 0, width = 0;
    std::string contents;
};

class Window_mgr
{
  public:
    using ScreenIndex = std::vector<Screen>::size_type;
    void clear(ScreenIndex);
  private:
    std::vector<Screen> screens{Screen(24, 80 ' ')};
};

void Window_mgr::clear(ScreenIndex i)
{
  Screen &s = screens[i];
  s.contents …
Run Code Online (Sandbox Code Playgroud)

c++ class friend forward-declaration

6
推荐指数
1
解决办法
519
查看次数

转发非类型参数会导致变量模板上出现不同的行为

这似乎是另一个"谁做得好"?问题,因为gcc 6.0.0和clang 3.7.0表现不同.

假设我们有一个变量模板,它采用const char *非模板参数,并且专用于给定的指针:

constexpr char INSTANCE_NAME[]{"FOO"};

struct Struct{ void function() const { std::cout << __PRETTY_FUNCTION__; } };
std::ostream &operator <<(std::ostream &o, const Struct &) { return o << INSTANCE_NAME; }

template <const char *> char   Value[]{"UNKNOWN"};
// spezialization when the pointer is INSTANCE_NAME
template <            > Struct Value<INSTANCE_NAME>{};
Run Code Online (Sandbox Code Playgroud)

请注意,模板变量具有不同的类型,具体取决于特化.十,我们有两个模板函数,每个函数都有一个const char *非模板参数,并将转发给变量模板:

template <const char *NAME> void print()
{
    std::cout << Value<NAME> << '\n';
}

template <const char *NAME> void …
Run Code Online (Sandbox Code Playgroud)

c++ template-specialization variable-templates c++14

6
推荐指数
2
解决办法
232
查看次数

联合的活动成员,统一初始化和构造函数

正如C++标准(工作草案)所说:

9.5.1 [class.union]

在并集中,至多一个非静态数据成员可以在任何时间处于活动状态,也就是说,任何时候最多一个非静态数据成员的值都可以存储在并集中.[...] union的大小足以包含其中最大的非静态数据成员.每个非静态数据成员都被分配,就好像它是结构的唯一成员一样.union对象的所有非静态数据成员都具有相同的地址.

但我不知道如何识别哪个是工会的活跃成员,而且我没有用到足够深入标准来找到标准所说的内容,我试图弄清楚活动成员是如何设置的但我发现它是如何交换的:

9.5.4 [class.union]

[ 注意:通常,必须使用显式析构函数调用和放置新运算符来更改联合的活动成员.- 注完 ] [ 实施例:考虑的对象uunion type U类型的具有非静态数据成员米Mn类型的N.如果M有一个非平凡的析构函数并且N有一个非平凡的构造函数(例如,如果它们声明或继承虚函数),则可以安全地将u的活动成员切换mn使用析构函数和placement new运算符,如下所示:

u.m.~M();
new (&u.n) N;
Run Code Online (Sandbox Code Playgroud)

- 结束例子 ]

所以我的猜测是,工会的活跃成员是首先签署,使用,构建或放置新的成员; 但是这对于统一初始化变得有点棘手,请考虑以下代码:

union Foo
{
    struct {char a,b,c,d;};
    char array[4];
    int integer;
};

Foo f; // default ctor
std::cout << f.a << f.b << f.c << f.d << '\n';
Run Code Online (Sandbox Code Playgroud)

哪个是上面代码的联合的活跃成员?是 …

c++ constructor unions uniform-initialization

6
推荐指数
1
解决办法
750
查看次数