我遇到了一个名为"member initializer"的奇怪概念.
这里说:
C++ 11添加了成员初始化器,如果构造函数没有初始化成员本身,则表达式将应用于类范围内的成员.
它的定义是什么?
是否有一些例子来说明它的用法?
#include <vector>
using namespace std;
struct A
{
vector<int> coll;
};
void f(const vector<int>&){}
void f(vector<int>&&){}
int main()
{
f(A().coll); // Is "A().coll" an xvalue?
}
Run Code Online (Sandbox Code Playgroud)
C++ 11保证f(A().coll)
会打电话void f(vector<int>&&)
吗?
无需过度解释.以下代码不言而喻:
struct X
{
X(int n){}
};
int main()
{
std::vector<int> src;
std::vector<X> dest;
// Below is not valid in current C++, but that is just what I want.
transform(src.begin(), src.end(), back_insert(dest), std::bind(&X::X, _1));
}
Run Code Online (Sandbox Code Playgroud)
构造函数接受一些参数并返回构造函数的类的对象.
构造函数看起来像一个函数,就像一个函数,并且只是一个函数.
所以,我认为std :: bind应该统一处理构造函数和其他可调用对象.
但是,如何扩展功能模板"bind"来实现呢?
void f(char* p)
{}
int main()
{
f("Hello"); // OK
auto p = "Hello";
f(p); // error C2664: 'void f(char *)' : cannot convert parameter 1
// from 'const char *' to 'char *'
}
Run Code Online (Sandbox Code Playgroud)
该代码是使用VC++ 2012年11月的CTP编译的.
§2.14.15字符串文字,第7节
窄字符串文字具有类型"n const char数组",其中n是下面定义的字符串的大小,并且具有静态存储持续时间.
为什么f("Hello")
好吗?
是new int[8]()
等同于new int[8]{}
在C++ 11?
换一种说法:
C++ 11标准是否保证每个new int[8]()
并new int[8]{}
返回零初始化数组?
#include <cstddef>
template<typename... Types>
constexpr std::size_t getArgCount(Types&&...) noexcept
{
return sizeof...(Types);
}
struct A
{
int n;
void f()
{
static_assert(getArgCount(n) > 0); // not ok, why?
}
};
int main()
{
int n;
static_assert(getArgCount(n) > 0); // ok
}
Run Code Online (Sandbox Code Playgroud)
为什么在编译时无法获得模板函数的参数计数?
错误信息:
1>test.cpp
1>test.cpp(17,45): error C2131: expression did not evaluate to a constant
1>test.cpp(17,42): message : failure was caused by a read of a variable outside its lifetime
1>test.cpp(17,42): message : see usage of 'this'
Run Code Online (Sandbox Code Playgroud) #include <type_traits>
template<typename T>
struct IsComplete final
: std::bool_constant<requires{sizeof(T);}>
{};
int main()
{
struct A;
static_assert(!IsComplete<A>::value); // ok
struct A{};
static_assert(IsComplete<A>::value); // error
}
Run Code Online (Sandbox Code Playgroud)
我预计第二个static_assert
应该是真的,因为 A 现在是一个完整的类型。
为什么 C++20 的要求表达式的行为不符合预期?
class A
{
public:
A(){}
private:
int i;
};
A a[8];
Run Code Online (Sandbox Code Playgroud)
C++ 11标准8.5.1.1说:
"聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),非静态数据成员(9.2)没有大括号或相等的初始化,没有私有或受保护的非静态数据成员(子句) 11),没有基类(第10条),也没有虚函数(10.3)."
作为一个数组,是一个聚合?我想不是,但标准是肯定的.
以下代码在C++中是否合法?
void f(void* = 0)
{}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
C++标准的哪一页说明这种用法是合法的?
int main()
{
short n1 = 8ll; // no warning
// warning C4305: 'initializing': truncation from '__int64' to 'short'
// warning C4309: 'initializing': truncation of constant value
short n2 = 88888ll;
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是Visual Studio 2017.
根据cppref:
整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和哪个整数后缀.
带后缀的整数文字ll
应为long long int
; 所以short n1 = 8ll
应该触发像short n2 = 88888ll
这样的警告.
如果C++ short int
足够小,C++是否允许将任何整数文字隐式转换为a ?