一个非常愚蠢的琐碎问题.规范的例子是f = open('filename')
,但是
f
不是很具描述性.在不查看代码之后,您可以忘记它是否意味着"文件"或"函数f(x)"或"傅里叶变换结果"或其他内容.EIBTI.file
已经被一个函数占用了.你还用什么?
class Foo
{
public:
explicit Foo() {}
explicit Foo(Foo&) {}
};
Foo d = Foo();
Run Code Online (Sandbox Code Playgroud)
错误:没有用于调用'Foo :: Foo(Foo)'的匹配函数
我试图改变Foo(Foo&)
,以Foo(Foo)
作为错误提示,这AFAIK不是有效的构造,果然,我得到:
错误:构造函数无效; 你可能意味着'Foo(const Foo&)'
是什么赋予了?我该如何解决这个问题?(顺便说一下,这是GCC)
我一直在读,Apple建议使用基于块的动画而不是CATransaction
以前,我使用此代码禁用动画:
[CATransaction begin];
[CATransaction setDisableActions: YES];
// !!! resize
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
是否有新的推荐方法来执行此操作,或者这仍然可以吗?
当对具有显式复制ctor的对象的容器进行排序时,我得到编译器错误(来自g ++ 4.8.2和clang ++ 3.4,两者都在-std = c ++ 11模式中),我不明白.我已经创建了一个简单的例子来演示这个问题
class A {
public:
explicit A(int i): m_i(i) {};
explicit A(const A& other): m_i(other.m_i) {};
int i() const {return m_i;};
private:
int m_i;
};
bool is_less(const A& a, const A& b) {
return a.i() < b.i();
}
int main(int, char*[]) {
std::vector<A> objects;
objects.push_back(A(3));
objects.push_back(A(5));
objects.push_back(A(-1));
std::cout << is_less(objects[1], objects[2]);
std::sort(objects.begin(), objects.end(), is_less);
for (auto& a: objects) {
std::cout << a.i() << " ";
}
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这失败了
error: …
Run Code Online (Sandbox Code Playgroud) 鉴于此代码(在wandbox上):
struct X
{
explicit operator int() { return 0; }
};
int main()
{
auto y = int{X{}};
}
Run Code Online (Sandbox Code Playgroud)
以及以下编译器选项:
-std = c ++ 1z -Wall -Wextra -Wpedantic
g++
(经过测试的版本:7,6.1,5.3) 拒绝使用以下错误编译代码
错误:初始化时无法将'X'转换为'int'
clang++
(测试版本:4,3.8,3.6) 愉快地编译了代码片段.
哪个编译器正在做正确的事情?
cppreference似乎表明auto var = type{...}
语法应该触发显式转换.
我最近在学习C++,我注意到了一个关于cppreference的例子,其中一部分是这样的:
struct B
{
explicit B(int) { }
explicit operator bool() const { return true; }
};
int main()
{
B b2(2); // OK: direct-initialization selects B::B(int)
if (b2) ; // OK: B::operator bool()
}
Run Code Online (Sandbox Code Playgroud)
隐式转换的介绍告诉我"当表达式在if语句或循环中使用时",此表达式(b2)的结果将被bool
隐式转换为类型.
此外,显式说明符的介绍告诉我"转换函数是否显式,它不能用于隐式转换".
由于b2将被隐式if(b2)
转换,并且转换函数是explicit
,怎么回事if(b2)
?
我了解到我们可以为 C++ 中的类提供转换运算符。所以我预计对于以下程序,c=1;
会使用转换运算符int()
。但令我惊讶的是;但这并没有发生,我们得到一个编译器错误,指出
error: no match for 'operator=' (operand types are 'C' and 'int')
。
所以我想知道为什么这里不使用转换运算符。
struct C {
explicit C(int);
operator int&();
};
int main() {
C c({});
c = 1; //this gives error. Why the conversion operator int&() is not used here?
}
Run Code Online (Sandbox Code Playgroud)
请注意,我知道如果我explicit
从构造函数中删除关键字就可以解决该错误。但我的问题是为什么不使用转换运算符。
我认为既然我们的类有一个转换运算符,那么可以将类对象转换为 anint
以便可以将其分配给。
c++ explicit type-conversion assignment-operator language-lawyer
最近引入了方法的重载,应用程序开始失败.最后跟踪它,新的方法被调用,我没想到它.
我们有
setValue( const std::wstring& name, const std::wstring& value );
std::wstring avalue( func() );
setValue( L"string", avalue );
std::wstring bvalue( func2() ? L"true", L"false" );
setValue( L"bool", bvalue );
setValue( L"empty", L"" );
Run Code Online (Sandbox Code Playgroud)
它被更改为当存储bool值时我们使用相同的字符串(字符串的内部数据存储)
setValue( const std::wstring& name, const std::wstring& value );
setValue( const std::wstring& name, const bool& value );
std::wstring avalue( func() );
setValue( L"string", avalue );
setValue( L"bool", func2() );
setValue( L"empty", L"" ); << --- this FAILS!?!
Run Code Online (Sandbox Code Playgroud)
L""的问题在于它是隐式转换,之前它很高兴成为std :: wstring,但它不喜欢是bool.MSVC编译器没有抱怨或提出警告,所以我担心即使我"修复"了setValue(L"空",L""); 成为
setValue( L"empty", std::wstring() );
Run Code Online (Sandbox Code Playgroud)
别人可能会稍后来,只需使用setValue(L"空",L""); 并且必须再次追踪这个问题. …
我有以下代码:
public struct Num<T>
{
private readonly T _Value;
public Num(T value)
{
_Value = value;
}
static public explicit operator Num<T>(T value)
{
return new Num<T>(value);
}
}
...
double d = 2.5;
Num<byte> b = (Num<byte>)d;
Run Code Online (Sandbox Code Playgroud)
这段代码编译,令我惊讶.显式转换应该只接受a byte
而不是a double
.但双重被接受了.当我在转换器中放置断点时,我发现它value
已经是byte
有价值的2
.通过从double到byte的转换应该是显式的.
如果我用ILSpy反编译我的EXE,我会看到下一个代码:
double d = 2.5;
Program.Num<byte> b = (byte)d;
Run Code Online (Sandbox Code Playgroud)
我的问题是:来自哪里的额外演员byte
?为什么那里有额外的演员?我的演员去Num<byte>
哪儿了?
编辑
结构Num<T>
是整个结构,所以没有更多隐藏的额外方法或运算符.
按要求编辑 IL:
IL_0000: nop
IL_0001: ldc.r8 2.5 // Load the double 2.5. …
Run Code Online (Sandbox Code Playgroud) 在找到关于stackoverflow的许多问题的答案之后,我现在遇到了一个我无法找到答案的问题,我希望有人愿意帮助我!
我的问题是我想在C++中对一个类中的函数进行明确的模板化.我的编译器(g ++)和C++标准(§14.7.3)中的一个看起来告诉我,这个特化必须在声明类的命名空间中完成.我明白这意味着我不能把专业化放在课堂里,但是我没有看到这个限制的重点!有没有人知道是否有充分的理由不让专业在课堂上进行?
我知道有一些解决方法,例如将函数放在结构体中,但我想理解为什么语言有这种设计.如果有充分的理由不在课堂上允许专门的功能,我想在尝试解决它之前我应该知道它.
提前致谢!
为了让我的问题更加精确:以下是一些测试示例中的代码,说明了我想要做的事情:
#include <cstdio>
namespace MalinTester {
template <size_t DIMENSIONALITY>
class SpecializationTest {
public:
SpecializationTest() {
privateVariable = 5;
};
virtual ~SpecializationTest() {};
void execute() {
execute<DIMENSIONALITY>();
};
private:
int privateVariable;
template <size_t currentDim>
static void execute() {
printf("This is the general case. Current dim is %d. The private variable is %d.\n", currentDim, privateVariable);
execute<currentDim-1>();
}
template <>
static void execute<0>() {
printf("This is the base case. Current dim is 0.\n");
}
};
Run Code Online (Sandbox Code Playgroud)
这是不可能的; g ++说: …