标签: explicit

您对文件描述符使用什么变量名?

一个非常愚蠢的琐碎问题.规范的例子是f = open('filename'),但是

  • f不是很具描述性.在不查看代码之后,您可以忘记它是否意味着"文件"或"函数f(x)"或"傅里叶变换结果"或其他内容.EIBTI.
  • 在Python中,file已经被一个函数占用了.

你还用什么?

python explicit file naming-conventions variable-names

12
推荐指数
2
解决办法
3605
查看次数

Foo f = Foo(); //没有用于调用'Foo :: Foo(Foo)'的匹配函数......嗯?

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)

c++ gcc constructor explicit

12
推荐指数
2
解决办法
1580
查看次数

在iOS4 +中明确禁用UIView动画

我一直在读,Apple建议使用基于块的动画而不是CATransaction

以前,我使用此代码禁用动画:

[CATransaction begin];
[CATransaction setDisableActions: YES];
// !!! resize
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

是否有新的推荐方法来执行此操作,或者这仍然可以吗?

animation explicit ios

12
推荐指数
3
解决办法
2万
查看次数

显式复制构造函数和std :: sort

当对具有显式复制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)

c++ sorting explicit std

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

`auto x = type {...}`初始化语法和`explicit`转换运算符 - clang vs gcc

鉴于此代码(在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++ explicit type-conversion language-lawyer c++17

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

将对象转换为bool时,显式说明符似乎不起作用

我最近在学习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++ explicit type-conversion

12
推荐指数
2
解决办法
584
查看次数

为什么给对象赋值时不使用转换函数?

我了解到我们可以为 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

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

为什么编译器选择bool over string进行L""的隐式类型转换?

最近引入了方法的重载,应用程序开始失败.最后跟踪它,新的方法被调用,我没想到它.

我们有

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""); 并且必须再次追踪这个问题. …

c++ explicit implicit visual-c++

11
推荐指数
2
解决办法
2688
查看次数

编译器用显式转换为.NET类型将显式转换替换为我自己的类型?

我有以下代码:

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)

c# generics casting explicit operators

11
推荐指数
2
解决办法
607
查看次数

为什么在类中不允许使用函数模板特化?

在找到关于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 ++说: …

c++ templates explicit class specialization

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