小编use*_*522的帖子

VS2013默认初始化vs值初始化

请考虑以下代码

struct B
{
    B() : member{}{};
    int member[10];
};

int main()
{
    B b;
}
Run Code Online (Sandbox Code Playgroud)

VS2013编译器发出以下警告:

警告C4351:新行为:数组'B :: member'的元素将默认初始化1> test.vcxproj - > C:\ Users\asaxena2\documents\visual studio 2013\Projects\test\Debug\test.exe

在此处记录

使用C++ 11,并应用"默认初始化"的概念,意味着B.member的元素将不会被初始化.

但我相信member{}应该执行值初始化而不是默认初始化.VS2013编译器坏了吗?

$ 7.0/6

默认初始化类型对象T意味着: - 如果T是(可能是cv限定的)类类型(第9节),T则调用默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,不执行初始化.
如果程序要求对const-qualified类型的对象进行默认初始化T,则T应该是具有用户提供的默认构造函数的类类型.

$ 8.5.1

对象或类型引用的列表初始化T定义如下:
- 如果初始化列表没有元素并且T是具有默认构造函数的类类型,则对象是值初始化的.
- 否则,如果T是聚合,则执行聚合初始化(8.5.1).

如果列表中的initializer-clause少于聚合中的成员,则未显式初始化的每个成员都应从空的初始化列表(8.5.4)初始化.[ 例如:

  struct S { int a; …
Run Code Online (Sandbox Code Playgroud)

c++ constructor value-initialization c++11 visual-studio-2013

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

C#Take operator

鉴于以下声明

int[] numbers = { 0, 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

我注意到.NET 4.6.1上的VS 2015允许以下内容采用前三个数字

IEnumerable<int> firstThree = System.Linq.Enumerable.Take(numbers, 3);
Run Code Online (Sandbox Code Playgroud)

但是,它不允许以下内容

IEnumerable<int> firstThree = numbers.Take(3);
Run Code Online (Sandbox Code Playgroud)

我是C#的新手,无法理解为什么调用没有解析为扩展方法.

.net c# linq

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