Tag: C#的

C ++ 11 auto:如果它获得一个常量引用呢?

请看下面的简单代码: class Foo { public: Foo(){} ~Foo(){} Foo(const Foo&){} Foo& operator=(const Foo&) { return *this; } }; static Foo g_temp; const Foo& GetFoo() { return g_temp; } 我试图使用这样的auto : auto my_foo = GetFoo(); 我预计my_foo将是一个常量引用Foo ,这是函数的返回types。 但是, auto的types是Foo ,而不是参考。 而且,通过复制g_temp来创buildmy_foo 。 这种行为对我来说并不明显。 为了得到对Foo的引用,我需要这样写: const auto& my_foo2 = GetFoo(); auto& my_foo3 = GetFoo(); 问题 :为什么auto GetFoo的返回types作为一个对象进行推导,而不是引用?

为什么派生类移动时可以构build基类不是?

考虑下面的例子: #include <iostream> #include <string> #include <utility> template <typename Base> struct Foo : public Base { using Base::Base; }; struct Bar { Bar(const Bar&) { } Bar(Bar&&) = delete; }; int main() { std::cout << std::is_move_constructible<Bar>::value << std::endl; // NO std::cout << std::is_move_constructible<Foo<Bar>>::value << std::endl; // YES. Why?! } 为什么编译器生成一个移动构造函数,尽pipe基类是不可移动的可构造的? 这是标准还是编译器错误? 是否有可能“完美地宣传”从基地到派生class的build设?

如何编写asynchronousLINQ查询?

在我读了一堆LINQ相关的东西之后,我突然意识到没有文章介绍如何编写asynchronousLINQ查询。 假设我们使用LINQ to SQL,下面的语句是明确的。 但是,如果SQL数据库响应缓慢,则使用此代码块的线程将受到阻碍。 var result = from item in Products where item.Price > 3 select item.Name; foreach (var name in result) { Console.WriteLine(name); } 似乎目前的LINQ查询规范不提供支持。 有什么办法做asynchronous编程的LINQ? 它的工作原理就好像有一个callback通知,当结果准备好使用时,在I / O上没有任何阻塞延迟。

如何使用.Net Core开发跨平台的gui应用程序

Asp.Net核心应用程序运行在Windows,Linux和MacOS上,但它是Web应用程序。 .Net核心应用程序是一个类库。 如何在.net framework或.net core上开发跨平台的gui应用程序?

在`typeid`代码中使用'?:`奇怪

在我正在开发的其中一个项目中,我看到了这个代码 struct Base { virtual ~Base() { } }; struct ClassX { bool isHoldingDerivedObj() const { return typeid(1 ? *m_basePtr : *m_basePtr) == typeid(Derived); } Base *m_basePtr; }; 我从来没有见过像那样使用typeid 。 为什么这么奇怪的跳舞?: ,而不是只是做typeid(*m_basePtr) ? 有什么理由吗? Base是一个多态类(具有虚拟析构函数)。 编辑:在这个代码的另一个地方,我看到这个,它似乎是等价的“多余的” template<typename T> T &nonnull(T &t) { return t; } struct ClassY { bool isHoldingDerivedObj() const { return typeid(nonnull(*m_basePtr)) == […]

C ++ 11允许对非静态和非常量成员进行类内初始化。 什么改变了?

在C ++ 11之前,我们只能对整型或枚举types的静态常量成员进行类内初始化。 Stroustrup在他的C ++ FAQ中讨论了这个问题 ,举例如下: class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral }; 以下推理: 那么为什么这些不便的限制存在? 一个类通常在头文件中声明,而头文件通常包含在许多翻译单元中。 但是,为了避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。 如果C ++允许将需要作为对象存储在内存中的实体的类定义中断,那么该规则将被破坏。 但是,C ++ 11放宽了这些限制,允许非静态成员的类内初始化(§12.6.2/ 8): 在非委托构造函数中,如果给定的非静态数据成员或基类不是由mem-initializer-id指定的(包括由于构造函数没有ctor初始值设定项而没有mem-initializer-list的情况)而实体不是抽象类(10.4)的虚拟基类 如果实体是一个非静态数据成员,它具有一个括号或等于初始值设定项 ,则该实体按照8.5中的规定进行初始化; 否则,如果实体是变体成员(9.5),则不执行初始化; 否则,实体将被默认初始化(8.5)。 […]

为什么使用EventArgs.Empty而不是null?

我记得在多个场合和多个地点阅读时发现这个典型事件: protected virtual OnSomethingHappened() { this.SomethingHappened(this, EventArgs.Empty); } 如果没有有趣的事件参数,e应该是EventArgs.Empty,而不是null。 我遵循我的代码中的指导,但我意识到,我不清楚为什么这是首选的技术。 为什么说明的合同更喜欢EventArgs.Empty over null? 在我自己的代码中,什么样的情况会certificate类似的devise决定是正确的? 什么时候应该考虑创build一些静态的“Nothing interesting here”属性,而不是使用null来表示没有什么有趣的东西? 增加了可为空值的types是否会影响这些决策?

函数返回值的自动对象,从而保证被破坏?

在[except.ctor]标准( N4140 )保证: 自从try块被input后,为所有构造的自动对象调用析构函数… 但是在下面的例子中,空输出certificate了函数foo的返回值没有被破坏,尽pipe它已经被构造了。 使用g ++(5.2.1)和clang ++(3.6.2-1)和选项-O0 -fno-elide-constructors -std=c++14 。 struct A { ~A() { cout << "~A\n"; } }; struct B { ~B() noexcept(false) { throw 0; } }; A foo() { B b; return {}; } int main() { try { foo(); } catch (…) { } } 这是g ++和clang ++中的一个bug,还是函数返回值不被视为自动对象,还是C ++语言中的循环漏洞? […]

获得sqrt(n)的整数部分的最快方法是什么?

我们知道,如果n不是一个完美的正方形,那么sqrt(n)将不是一个整数。 由于我只需要整数部分,我觉得调用sqrt(n)不会那么快,因为计算小数部分也需要时间。 所以我的问题是: 如果不计算sqrt(n)的实际值,我们只能得到sqrt(n)的整数部分吗? 该algorithm应该比sqrt(n) (在<math.h>或<cmath>定义sqrt(n)更快? 如果可能的话,你也可以在asm块中写代码。

memset如何用-1来初始化一个整型数组?

关于memset的manpage说: #include <string.h> void *memset(void *s, int c, size_t n) memset()函数用常量字节c填充s指向的内存区域的前n 个字节。 很明显memset不能用来初始化int数组,如下所示: int a[10]; memset(a, 1, sizeof(a)); 这是因为int是由4个字节(比如说)表示,并且不能获得数组a整数的期望值。 但我经常看到程序员使用memset将int数组元素设置为0或-1 。 int a[10]; int b[10]; memset(a, 0, sizeof(a)); memset(b, -1, sizeof(b)); 根据我的理解,使用整数0初始化是可以的,因为0可以用1个字节表示(可能在这种情况下我错了)。 但是如何用-1 (一个4字节的值)来初始化b ?