- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一些 C++ hack 使用转换运算符来获取有关构造函数的一些信息。
我想知道,为T
选择具体类型的过程是什么?在模板化转型运算符的解析中。
#include <iostream>
#include <type_traits>
using std::cout;
using std::endl;
struct A {
A(int) { cout << "int" << endl; }
A() { cout << "def" << endl; }
A(const A&) { cout << "copy" << endl; }
A(A&&) { cout << "move" << endl; }
};
struct B {
template<typename T> operator T()
{ return {}; }
};
template<typename Except>
struct C {
template<typename T,
std::enable_if_t<!std::is_same_v<T, Except>>* = nullptr> operator T()
{ return {}; }
};
template<typename T>
void f(A a = { T() }) {}
int main() {
f<B>();
f<C<A>>();
return 0;
}
此代码打印:
def
int
而不是这个:
int
int
为什么要禁用转换以获取我想要的构造函数(int 版本)?
EXE = C++Tuple
CXX = g++
CXXFLAGS = -std=c++17
run: $(EXE)
./$(EXE)
.PHONY: run
$(EXE): main.cpp
$(CXX) $(CXXFLAGS) -o $@ $<
平台:
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
$ uname -r
4.4.0-19041-Microsoft
最佳答案
首先,包括当前的 GCC 在内的几个编译器/版本确实拒绝这样做。
复制初始化
让我们从一个更简单的案例开始:
template<typename T>
void f(A = T()) {}
在这里,我们有一个
表达式 类型
T
我们想要(隐式)转换为
A
.不出所料,
B
生产
operator A
作为其转换函数模板的特化,
C
由于 SFINAE,什么也没有产生。
T
永远不会被推断为
A&&
左右,即使约束允许这样做;即使某些其他类型(例如,派生类)被允许用于(非模板)转换函数(无需为每个允许的类型付出任何努力),也只使用单数的“明显”类型进行此类推导。
C<A>
至
int
试图调用
A(int)
构造函数;一般情况下,这种转换当然是可能的,但在这种情况下,关于
的通常规则不允许这种转换。多个 [over.best.ics.general]/4 中的用户定义转换:
However, if the target is the first parameter of a constructor [...] and the constructor or user-defined conversion function is a candidate by [...], [over.match.copy], or [...] user-defined conversion sequences are not considered.
A
的每个构造函数从参数到参数类型的(用户定义的)转换被考虑。
B
当前版本的 GCC、ICC 和 MSVC 都拒绝
歧义 , 自
B
可以转换为
int
或至
A
. (ICC 有用地指出,由于 [over.ics.rank]/3.2.3,移动构造函数比复制构造函数更匹配,但仍然有两种选择。)很难猜测为什么 Clang 忽略了前一种可能性(什么没有诊断输出),但其他编译器似乎是
正确 : [dcl.init.list]/3.7 遵循正常的重载决议(除了更喜欢
std::initializer_list
构造函数,这里不相关),并且没有理由更喜欢一个构造函数而不是另一个(因为用户定义的在每种情况下都涉及到后跟精确匹配标准转换序列的转换序列)。
C<A>
再次,扣除
const A&
或
A&&
构造函数精选
T
=
A
(这次是因为 [temp.deduct.conv] 的简化,而不是 [over.match.copy] 的限制)并且什么也没找到。因此
仅限 “转换”
C<A>
→
int
→
A
作品。所有四个编译器都同意这种情况,尽管 MSVC 错误地发出有关“非法”双重转换的警告。
关于c++ - 模板化转换运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63891809/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!