#include<iostream> using namespace std; struct B{}; struct A { A(const B &) { cout<<"A(const B &)"<<endl; } A(B &&) { cout<<"A(B &&)"<<endl; } }; A get() { B b; return b; } int main() { get(); } 我用VC ++ 14.2和GCC 5.4.0testing了代码,两者都输出: A(B &&) 为什么输出不是 A(const B &) ? 这段代码和copy elision有什么关系吗? (但是A和B是不同的types,所以copy elision不应该在这里工作)
在C#中,我们不能改变访问修饰符,而从基类重写一个方法。 例如 Class Base { **protected** string foo() { return "Base"; } } Class Derived : Base { **public** override string foo() { return "Derived"; } } 这在C#中是无效的,它会给编译时间带来错误。 我想知道原因,为什么不允许。 有没有技术上的问题,或者是否会导致在访问限制方面不一致?
考虑这个代码: #include <memory> #include <iostream> class A { public: A(int data) : data_(data) { std::cout << "A(" << data_ << ")" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } void a() { std::cout << data_ << std::endl; } private: int data_; }; class B { public: B(): a_(new A(13)) { std::cout << […]
可能重复: 指针variables和引用variables在C ++中有什么区别? 在C ++中通过引用传递指针是否有好处? 在这两种情况下,我都达到了这个结果。 那么什么时候比其他人更喜欢? 我们之间使用的理由是什么? #include <iostream> using namespace std; void swap(int* x, int* y) { int z = *x; *x=*y; *y=z; } void swap(int& x, int& y) { int z = x; x=y; y=z; } int main() { int a = 45; int b = 35; cout<<"Before Swap\n"; cout<<"a="<<a<<" b="<<b<<"\n"; swap(&a,&b); […]
它在这里和这里说的typeslong long至less和int一样长,并且不less于64位 。 我一直在看C ++ 11标准§3.9.1基本types部分,我找不到任何对64位的引用。 我所能find的是,至less在long int ,至less和int一样长。 该标准列出了long long的标准整数types,而不是一个扩展的types,所以我想知道是否这个long long持有至less64位的断言是真实的。 如果是,它在哪里陈述? 请注意,我只是在谈论C ++ 11标准long long而已。
我有以下C ++ 11代码。 #include <type_traits> using IntType = unsigned long long; template <IntType N> struct Int {}; template <class T> struct is_int : std::false_type {}; template <long long N> struct is_int<Int<N>> : std::true_type {}; int main() { static_assert (is_int<Int<0>>::value, ""); return 0; } Clang ++ 3.3编译代码,但在g ++ 4.8.2静态断言失败 $ g++ -std=c++11 main.cpp main.cpp: In function […]
我正在尝试使用TransactionScope,但不断得到下面的exception。 该应用程序运行在不同于数据库的机器上,如果这很重要的话。 我正在使用Sql Server 2005。 “分布式事务pipe理器(MSDTC)的networking访问已被禁用,请使用组件服务pipe理工具在MSDTC的安全configuration中启用DTC进行networking访问。 using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); } 编辑 我根据反馈做出了一些反应。 现在我得到这个错误: {"Error HRESULT E_FAIL has been returned from a call to a COM component."} {"Communication with the underlying transaction manager has failed."} 解决scheme我认为接受的答案确定了我所得到的最初的问题。 第二个错误似乎是特定于entity framework。 我会张贴另一个问题。 以下是客户端的属性: 客户端http://www.portnine.com/datahttp://img.dovov.comMisc/client.jpg 以下是服务器上的属性: 服务器http://www.portnine.com/datahttp://img.dovov.comMisc/server.jpg
我不确定我是否理解未定义的行为会危害程序的程度。 比方说,我有这个代码: #include <stdio.h> int main() { int v = 0; scanf("%d", &v); if (v != 0) { int *p; *p = v; // Oops } return v; } 这个程序的行为是不是只针对v为非零的情况定义,或者即使v是零也不定义?
场景是非常罕见的,但很简单:您定义了一个generics类,然后创build一个嵌套类,它从外部类inheritance,并在嵌套内定义一个关联字段(自我types)。 代码片段比描述更简单: class Outer<T> { class Inner : Outer<Inner> { Inner field; } } IL反编译后,C#代码如下所示: internal class Outer<T> { private class Inner : Outer<Outer<T>.Inner> { private Outer<Outer<T>.Inner>.Inner field; } } 这似乎是公平的,但是当你改变字段的types声明时,事情变得更加棘手。 所以当我更改字段声明 Inner.Inner field; 反编译之后,这个字段将如下所示: private Outer<Outer<Outer<T>.Inner>.Inner>.Inner field; 我明白,这个阶级的“嵌套”和inheritance不太相称,但是我们为什么要观察这样的行为呢? Inner.Inner types声明已经改变了types? Inner.Inner 和 Inner types在这种情况下有所不同? 当事情变得非常棘手 您可以在下面看到反编译的源代码 。 它真的很大,总共有12159个符号。 class X<A, B, C> { class […]
所以,玩弄constexpr,MSVC(Visual Studio 2012)给了我一个错误,而试图使用这个简单的程序(包括省略)与constexpr关键字限定我的function: constexpr int factorial(int n) { return n <= 1 ? 1 : (n * factorial(n-1)); } int main(void) { const int fact_three = factorial(3); std::cout << fact_three << std::endl; return 0; } constexpr被强调为红色并带有以下信息: 错误:此声明没有存储类或types说明符 并试图编译该程序给出了以下输出: 1> main.cpp(5):错误C2144:语法错误:'int'应该以';'开头 1> main.cpp(5):错误C4430:缺lesstypes说明符 – int假定。 注意:C ++不支持default-int 它真的令我困惑,因为它是Cppreference 用来说明constexpr的使用的一个例子。 起初,我用一个简单的函数返回一个文字,即constexpr int func(){return 5;} ,但是产生了相同的错误。 我将第一条消息解释为“它应该是一个结构或类的成员函数”,但Cppreference的例子显示它不是必要的。 那么,我显然在这里错过了什么?