小编Ben*_*igt的帖子

为什么短路不能阻止与逻辑AND(&&)的不可达分支相关的MissingMethodException?

在检查我的Windows移动设备上是否有摄像头并启用时,我遇到了一些我不理解的东西.

代码如下所示:

    public static bool CameraP(){

        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent;
    }

    public static bool CameraE()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent1()
    {
        return Microsoft.WindowsMobile.Status.SystemState.CameraPresent
              && Microsoft.WindowsMobile.Status.SystemState.CameraEnabled;
    }

    public static bool CameraPresent2()
    {
        return CameraP() && CameraE();
    }
Run Code Online (Sandbox Code Playgroud)

当我调用CameraPresent2()它时返回false(没有相机存在).但是,当我打电话给CameraPresent1()我收到一个MissingMethodException并注释"找不到方法:get_CameraEnabled Microsoft.WindowsMo​​bile.Status.SystemState."

第二个术语的评估CameraPresent1是因为它们都是属性(在语言层面)吗?

还有什么能解释行为上的差异吗?

c# compact-framework short-circuiting

20
推荐指数
3
解决办法
793
查看次数

为什么默认情况下全局命名空间中没有C++ 14标准定义的文字?

C++ 14包括标准定义的文字,其中包括标题中的std::string各种时间跨度<chrono>.

要使用它们,您必须说using namespace std::literals;(或者某些变化取决于您想要的文本,因为它们位于各种内联命名空间中).

这一切都很好,但我很好奇为什么using需要声明.没有前导下划线的UDL保留用于实现,因此"hello world"s在符合标准的程序中不可能有任何其他含义.

那么为什么#include <string>不足以将文字转换功能纳入范围呢?为什么我必须明确包含文字命名空间?

编辑: N3531是我能找到的提案的最新版本 - 不幸的是,它没有讨论将东西放入命名空间的动机,但只说:

可以总结[波特兰]讨论的要求如下:

  • 为一组(相关的)UDL运算符使用内联命名空间

c++ user-defined-literals c++14

20
推荐指数
2
解决办法
3162
查看次数

扩展Convert.ChangeType以根据请求生成用户定义的类型

鉴于课程:

public class Foo
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

是否可以通过Convert.ChangeType从字符串创建Foo实例:

Type type = typeof(Foo);
object value = "one";

value = System.Convert.ChangeType(value, type);
Run Code Online (Sandbox Code Playgroud)

这是第三方API尝试重建对象的方式.有人提到这可能是隐式运算符,但从我的理解,我将执行以下操作,而不是创建对象:

Foo foo = new Foo() { Name = "one" };
string fooAsString = foo;  // implicit conversion -- no cast needed
Run Code Online (Sandbox Code Playgroud)

有没有办法以这种方式创建对象?此外,如果有另一种方法,我可以更改Convert.ChangeType.

更新: 我问的原因是因为它抛出异常:

从'System.String'到'JibbaJabba + Foo'的转换无效.

并添加运营商没有解决问题.

c# type-conversion

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

由多重继承引起的"无法访问的直接基础"

剧透警报:也许是一个愚蠢的问题.:)

#include <iostream>

using namespace std;

class Base
{
    public:
        virtual void YourMethod(int) const = 0;
};

class Intermediate : private Base
{
    public:
        virtual void YourMethod(int i) const
        {
            cout << "Calling from Intermediate" << i << "\n";
        }
};

class Derived : private Intermediate, public Base
{
    public:
        void YourMethod(int i) const
        {
            cout << "Calling from Derived : " << i << "\n";
        }
};

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

有人可以向我解释为什么会抛出编译器警告:

main.cpp:21: warning: direct …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance

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

用于字符串连接的snprintf

我使用snprintf将字符串连接到char数组:

char buf[20] = "";
snprintf(buf, sizeof buf, "%s%s", buf, "foo");
printf("%s\n", buf);
snprintf(buf, sizeof buf, "%s%s", buf, " bar");
printf("%s\n", buf);
Run Code Online (Sandbox Code Playgroud)

问题是第二次连接buf而不是添加"bar",替换"foo"它.输出如下:

foo
bar
Run Code Online (Sandbox Code Playgroud)

第一个%s应该保留buf(在这种情况下保持"foo").第二个%s应该附加"bar"它.对?

我究竟做错了什么?

c string

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

在IntelilJ中,像Eclipse这样的Alt左/右箭头键是什么?

在Eclipse中,您可以使用alt+ <-->在您所在的位置之间移动.Intellij的等价物是什么?

java eclipse intellij-idea

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

基于范围的多维数组

我的嵌入式系统有一个支持C++ 11的g ++版本,所以我一直在清理代码

for( uint16_t* p = array; p < (&array)[1]; ++p ) {
    *p = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

for( uint16_t& r : array ) {
    r = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

这是更具有可读性.

是否存在基于范围的for循环,它可以在所有元素上运行array2[m][n]

旧版本是

for( int16_t* p = array2[0]; p < (&array2)[1][0]; ++p ) {
    *p = fill_value;
}
Run Code Online (Sandbox Code Playgroud)

我不希望嵌套循环,除非保证编译器将它们展平.

(FWIW,编译器是TI Code Composer Studio 6.0.0附带的GNU 4.7.4 Linaro g ++ ARM交叉编译器)

c++ arrays foreach for-loop c++11

17
推荐指数
2
解决办法
8160
查看次数

在VS2010中,abort()不是__declspec(noreturn)

在我的VS2010副本中,stdlib.h包含(第353-355行)

_CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
_CRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
_CRTIMP void __cdecl abort(void);
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪,没有noreturn注释abort().有谁知道这个的原因?这是一个错误吗?

编辑:在VS2008中,它是相同的,但是stdlib.h的第371-373行

缺少noreturn注释会触发错误C4716.

进一步参考:用于noreturn标注注释的C++ 0x提议,它表示abort应该携带它.

编辑:看起来像一堆讨论消失了删除的答案,但它的要点包含在缺陷报告#048中.

c c++ visual-studio-2010 abort

16
推荐指数
1
解决办法
1600
查看次数

为什么只有在声明自定义构造函数时才能访问基类析构函数?

Comeau,g ++(ideone)和EDG接受以下代码而无需诊断.Visual C++编译成功,尽管有警告C4624.

class indestructible_base
{
  ~indestructible_base();
};

class T : indestructible_base
{
public:
  //T() {}
};

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

取消注释构造函数,它不再编译.

也许这是规则,如果在构造函数内发生异常,必须销毁子对象?看起来很奇怪,因为身体是空的,不能引起异常.即便如此,添加一个异常规范担保,不会抛出任何异常(throw()noexcept)并且没有任何区别.

为什么用户声明的构造函数需要访问基类析构函数,而自动生成的构造函数则不需要?

这个问题的灵感来自于:防止析构函数在C++中运行

c++ inheritance destructor access-modifiers language-lawyer

16
推荐指数
1
解决办法
642
查看次数

使用strlen()时"未在此范围内声明"

我正在尝试编译这段代码,但无论出于何种原因它都无法正常工作.有人能帮我吗?我想知道如何正确使用strlen():

 #include<iostream>
 using namespace std;

 int main()
 {
    char buffer[80];

    cout << "Enter a string:";
    cin >> buffer;
    cout << strlen(buffer);

    return 0;

 }
Run Code Online (Sandbox Code Playgroud)

我尝试过使用cin.getline(buffer,80); 但我得到了相同的编译错误问题.

我的编译器说错误就是这个

错误:strlen未在此范围内声明

c++

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