小编dra*_*oot的帖子

是否允许枚举具有未列出的值?

说,我们有

enum E
{
  Foo = 0,
  Bar = 1
};
Run Code Online (Sandbox Code Playgroud)

现在,我们做到了

enum E v = ( enum E ) 2;
Run Code Online (Sandbox Code Playgroud)

然后

switch ( v )
{
  case Foo:
    doFoo();
  break;
  case Bar:
    doBar();
  break;
  default:
    // Is the compiler required to honor this?
    doOther();
  break;
}
Run Code Online (Sandbox Code Playgroud)

由于上面的开关处理枚举的每个可能列出的值,是否允许编译器优化掉default上面的分支,或者在enum的值不在列表中的情况下具有未指定或未定义的行为?

正如我期望C和C++的行为应该类似,问题在于两种语言.但是,如果在这种情况下C和C++之间存在差异,那么了解它也会很好.

c c++ enums language-lawyer

36
推荐指数
2
解决办法
3995
查看次数

为什么lambda参数在C++ 11中以只读方式传递?

当一个函数按值获取参数时,它通常可以修改它.然而,lambdas似乎并非如此.为什么?

int main()
{
  int x = 0;
  auto lambda = [x] { x = 1; }; // error: assignment of read-only variable ‘x’
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

lambda c++11

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

"无法注册输入通道" - 这是由什么引起的,以及如何解决这个问题?

我收到了以下错误,我的应用用户通过市场开发者控制台报告:

java.lang.RuntimeException: Failed to register input channel. Check logs for details.
    at android.view.InputQueue.nativeRegisterInputChannel(Native Method)
    at android.view.InputQueue.registerInputChannel(InputQueue.java:92)
    at android.view.ViewRoot.setView(ViewRoot.java:568)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.view.Window$LocalWindowManager.addView(Window.java:465)
    at android.app.Dialog.show(Dialog.java:241)
    at my.program.MyActivity.handleFailure(Unknown Source)
    at my.program.MyActivity$RunFailed.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3835)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

斜体线是我的代码的一部分.有问题的代码只是创建并显示一个对话框.它从一个Runnable发布到一个Handler.一切都应该在GUI线程中发生(这Handler就是使用的原因).

我不知道如何调试这个.我自己没有遇到过这个问题,而我所拥有的只是一堆自动报告.谷歌在这个确切的问题上显示了几个线程,但没有答案(除了暗示这是Android 2.3.3特定的问题).

user-interface android forceclose

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

以N为模的随机数的均匀性

[0,n)中选择随机数的一种常用方法是采用rand()n的结果:rand() % n.但是,即使可用rand()实现返回的结果完全一致,当n = n均匀分配时,结果[0,n]数的均匀性是否应该存在问题?例如假设为2,n为2.然后,在3个可能的输出中:0,1和2,当我们使用模n时,我们分别得到0,1和0 .因此输出将根本不是均匀的.RAND_MAX + 1RAND_MAXrand()

这在实践中是一个真正的问题吗?选择[0,n]中的随机数是一种更好的方法,从rand()输出中均匀推导出来,最好没有任何浮点运算?

c random uniform

11
推荐指数
2
解决办法
4940
查看次数

转换到C++ 11,其中使用noexcept隐式声明析构函数

在C++ 11中,隐式声明了没有任何异常规范的析构函数 noexcept,这是对C++ 03的更改.因此,用于从C++ 03中的析构函数抛出的代码仍然可以在C++ 11中正常编译,但是一旦尝试从这样的析构函数抛出就会在运行时崩溃.

由于这样的代码没有编译时错误,如何将它安全地转换为C++ 11,而不是将代码库中的所有现有析构函数声明为noexcept(false),这实际上是过于冗长和干扰,或者检查每个析构函数是否有可能抛出,这将非常耗时且容易出错,或者在运行时捕获并修复所有崩溃,这永远无法保证找到所有这些情况?

c++ destructor exception-handling exception-specification c++11

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

如何通过SFINAE测试班级内部班级的存在?

我正在尝试为具有特定名称的内部类的类提供不同的模板特化.我从这里找到了一个线索并尝试了以下方法:

#include <iostream>

template< typename T, typename Check = void > struct HasXYZ
{ static const bool value = false; };

template< typename T > struct HasXYZ< T, typename T::XYZ >
{ static const bool value = true; };

struct Foo
{
  class XYZ {};
};

struct FooWithTypedef
{
  typedef void XYZ;
};

int main()
{
  // The following line prints 1, as expected
  std::cout << HasXYZ< FooWithTypedef >::value << std::endl;
  // The following line prints 0. Why? …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae template-specialization

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

为什么Python的工作日()与C中的tm_wday不同?

Python文档定义datetime.weekday()一个整数,其中星期一为0,星期日为6,而C的tm.tm_wday定义为星期日以来的天数.因此tm_wday(datetime.weekday() + 1) % 7,这是相当不方便.鉴于Python通常接近C等价物,为什么这样做?

c python datetime

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

如何在无需创建其实例的情况下获取 std::array&lt;T, N&gt; 中的元素数量?

std::array<T, N>::size(),但它是非静态的,所以它需要一个 的实例std::array。有没有办法获得它返回的值(即Nof std::array<T, N>)而不必构造数组的实例?对于普通数组,我可以使用sizeof,但我不能保证这sizeof(std::array<T, N>) == N * sizeof(T)是真的。

c++ arrays sizeof c++11

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

为什么以下代码崩溃?

这只是创建了一些列表元素,然后在开始时通过反向迭代删除元素.它是代码的实际问题的复制品,它在反向遍历它们时删除元素.

#include <list>

int main()
{
  std::list< int > lst;

  for ( int c = 33; c--; )
    lst.push_back( 0 );

  int count = 0;
  for ( std::list< int >::reverse_iterator i = lst.rbegin(), e = lst.rend();
        i != e; )
  {
    switch( count++ )
    {
      case 32:
      case 33:
        ++i;
        i = std::list< int >::reverse_iterator( lst.erase( i.base() ) );
      break;
      default:
        ++i;
    }
  }

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

运行时,它会崩溃:

*** glibc detected *** ./a.out: double free or corruption (out): 0x00007fff7f98c230 *** …
Run Code Online (Sandbox Code Playgroud)

c++ crash list

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

哪个 C++ 编译器对此代码有错误?

以下内容由 gcc(12.1 和 trunk)编译良好,但 clang(14.0.0 和 trunk)在 上给出错误d.foo(),表示调用不明确。问题是,我应该向哪个编译器报告错误?

class Base
{
public:
  void foo() {}
};

class Derived: public Base
{
public:
  using Base::foo;
  void foo() & {}
};

int main()
{
  Derived d;

  // Clang says here: error: call to member function 'foo' is ambiguous. Gcc,
  // however, is fine with it
  d.foo();

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

c++ inheritance using language-lawyer

8
推荐指数
0
解决办法
78
查看次数