使用"T &&"参数重载函数模板通常是一个坏主意,因为它可以绑定到任何东西,但我们假设我们仍然这样做:
template<typename T>
void func(const T& param)
{
std::cout << "const T&\n";
}
template<typename T>
void func(T&& param)
{
std::cout << "T&&\n";
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,const T&重载将被调用为const lvalues的参数,并且T&&将为所有其他参数类型调用重载.但是考虑一下当我们func使用const和非const内容的数组调用时会发生什么:
int main()
{
int array[5] = {};
const int constArray[5] = {};
func(array); // calls T&& overload
func(constArray); // calls const T& overload
}
Run Code Online (Sandbox Code Playgroud)
VC10,VC11和gcc 4.7同意显示的结果.我的问题是为什么第二个调用会调用const T&重载.简单的答案是它constArray有一个const,但我认为这太简单了.其推导的类型T(不论模板有选择的)是这样的类型"的5个常量整数数组" param在const T&过载将是"参考的5个常量整数常量数组".但是名为constArray的数组本身并不是const.那么为什么调用不func(constArray)调用T&&重载,从而产生一个param"引用5个const整数数组"的类型?
这个问题的动机是与c ++模板函数参数演绎和函数解析中的问题相关的讨论,但我认为该线程在其他问题上有所偏差,并没有澄清我现在在这里问的问题.
如果我有一个std::thread对象t,我可以t.native_handle()用来访问底层线程实现的API(例如,pthreads或Windows线程).但是,如果我从底层线程实现(例如,pthreads线程)有一个句柄,该怎么办?有没有办法将其转换为C++ 11 std::thread?
这样做的动机是可能需要使用本机平台线程API来设置具有例如特定关联或特定堆栈大小的线程(或者通过C++ 11 API无法访问的某些其他特性) ).但是,从那时起,坚持使用C++ 11功能会很不错.
有没有办法做到这一点?
我的理解是这个(荒谬的)代码无效C++ 14:
class Point {
public:
constexpr double setX(double newX) { return x = newX; }
private:
double x;
};
Run Code Online (Sandbox Code Playgroud)
我想弄清楚C++ 14标准中的哪一部分(仍然正式起草)不允许它.对constexpr功能的限制在7.1.5/2中列出.(抱歉格式错误.我无法弄清楚如何击败降价使其看起来正确.)
constexpr函数的定义应满足以下约束:
- 它不应是虚拟的(10.3);
- 其返回类型应为字面类型;
- 每个参数类型都应是文字类型;
- 它的函数体应为= delete,= default或不包含的复合语句
- asm-definition,
- 一个goto声明,
- 尝试块,或
- 非文字类型或静态或线程存储持续时间的变量的定义,或者不执行初始化的定义.
那里没有任何禁止分配给数据成员的东西.在5.19/2(子弹15)中有这样的禁令(再次出现格式错误,抱歉):
条件表达式e是核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:[...]对象的修改(5.17,5.2.6) ,5.3.2)除非它适用于文字类型的非易失性左值,指的是在e的评估范围内开始生命的非易失性对象;
但我不知道5.19如何适用于7.1.5.有人可以澄清一下吗?
exiftool为它处理的每个文件生成多行输出。我想在目录中的所有 jpg 上调用它,并且想查看每个文件输出了多少行。这样做,
exiftool *.jpg | measure-object -line
Run Code Online (Sandbox Code Playgroud)
给出所有文件的输出总行数,而不是每个文件的行数。我也尝试过这个,
exiftool *.jpg | foreach{get-content $_ | measure-object -line}
Run Code Online (Sandbox Code Playgroud)
但这只是表明我不知道如何使用Powershell(即,我收到很多错误消息)。帮助?
C++ 11 2.3/2说:
universal-character-name\UNNNNNNNN指定的字符是ISO/IEC 10646中字符短名称为NNNNNNNN的字符.
所以我下载了ISO/IEC 10646,但我找不到"字符短名称"的定义.有人可以澄清这应该指的是什么?
我最初的目标是找出为什么在用\ U指定代码点时需要8位十六进制数字,因为六位数总是足够的.所以我也有兴趣知道为什么C++ 11指定我们使用\ UNNNNNNNN而不是\ UNNNNNN.
在C++ 11的最终草案中,基于范围的for循环可以指定通过一对迭代器迭代的范围.这使得迭代正则表达式的所有匹配变得容易.后来删除了使用一对迭代器指定范围的能力,它在C++ 11中不存在.是否仍然有一种直接的方法来迭代特定正则表达式的所有匹配?我希望能够做到这样的事情:
std::regex begin(" 1?2?3?4* ");
std::regex end;
for(auto& match: std::pair(begin, end)) process(*match);
Run Code Online (Sandbox Code Playgroud)
在C++ 11中是否支持这种事情?
两年多以前,Stephan T. Lavavej描述了他在微软的实现中实现的节省空间的优化std::make_shared,我从与他的谈话中得知微软对采用这种优化的其他库实现没有任何反对意见.如果您确定其他库(例如,Gnu C++,Clang,Intel C++和Boost(for boost::make_shared))是否已采用此实现,请提供答案.我没有准备好访问那么多的make_shared实现,也不是在考虑如果他们已经实现了WKWYL优化的那些我必须看到的内容,但我希望SO读者知道一些答案图书馆副手.我知道从Boost 1.52开始的代码,WKWYL优化还没有实现,但Boost现在达到了1.55版本.
请注意,此优化不同于std::make_shared避免使用的引用计数的专用堆分配的能力std::shared_ptr.有关WKWYL与优化之间差异的讨论,请参阅此问题.
根据C++ 11标准的表59,时钟::is_steady函数返回const bool而不是bool.无论哪种方式,返回类型将是内置类型的右值,因此是不可修改的,因此const似乎只添加噪声.那么为什么const bool不简单bool呢?
草案C++ 14增加了对变量模板的支持.在建议(例子N3651)所有节目常数(无论是constexpr或const),但是,从我可以告诉,这不是必需的.可变模板变量可以变化,例如,分配给?
template<typename T>
T magicVal = 42;
magicVal<int> = 0; // okay?
Run Code Online (Sandbox Code Playgroud) 如果我有一个原子变量,例如,
std::atomic<int> x;
Run Code Online (Sandbox Code Playgroud)
我想对它执行读写操作,我可以使用"普通"语法,例如,
std::cout << x; // read from x
x = 5; // write to x
Run Code Online (Sandbox Code Playgroud)
我也可以使用显式load和store成员函数:
std::cout << x.load(); // read from x
x.store(5); // write to x
Run Code Online (Sandbox Code Playgroud)
我见过Andrei Alexandrescu和Anthony Williams等人的建议只使用了表达load和store形式,大概是因为"正常"形式并没有强调变量是原子的.这似乎就像一种匈牙利符号.是否有关于在读写原子时使用的语法的新兴惯例?
c++ ×9
c++11 ×7
c++14 ×2
atomic ×1
boost ×1
constexpr ×1
optimization ×1
powershell ×1
shared-ptr ×1
stdatomic ×1
templates ×1
unicode ×1