Home Backend Development C++ Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.

Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.

Nov 02, 2024 pm 03:33 PM

Is

Most Vexing Parse Confusion: Clarifying the Ambiguity

In C 11, uniform initializers introduce a subtle ambiguity known as "most vexing parse." Let's delve into an example that demonstrates this issue:

<code class="cpp">#include &lt;iostream&gt;

class Timer {
public:
    Timer() {}
};

int main() {
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"?
    return 0;
}</code>
Copy after login

Analysis:

In the first line:

<code class="cpp">auto dv = Timer();</code>
Copy after login
  • What is Timer()? Timer() is a constructor of the Timer class that takes no arguments. It initializes an object of type Timer.
  • What type is dv? dv is declared using auto, which infers its type from the initializer. Since the initializer is of type Timer, dv is of type Timer.

In the second line:

<code class="cpp">int time_keeper(Timer());</code>
Copy after login
  • Is this a function? Yes, this is a function declaration. It declares a function called time_keeper that returns an int and takes an argument.
  • Why isn't the argument "Timer () ()"? This is a peculiar case of the "most vexing parse" ambiguity. When a function is passed as an argument to another function, it automatically decays to a pointer to the function. So, in this case, the argument is not Timer () (), but rather Timer().

To prove this, consider the following program:

<code class="cpp">#include &lt;type_traits&gt;

struct Timer { };
int main() {
    int time_keeper(Timer());
    static_assert(
        std::is_same&lt;
            decltype(time_keeper),
            int(Timer(*)())
        &gt;::value,
        "This should not fire!");
}</code>
Copy after login

This program compiles successfully, confirming that time_keeper takes a pointer to a function as an argument.

In conclusion, the "most vexing parse" confusion stems from the fact that the expression Timer() can be interpreted as either an object of type Timer or a function pointer to a function that returns a Timer. The correct interpretation depends on the context in which the expression is used.

The above is the detailed content of Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What are the types of values ​​returned by c language functions? What determines the return value? What are the types of values ​​returned by c language functions? What determines the return value? Mar 03, 2025 pm 05:52 PM

What are the types of values ​​returned by c language functions? What determines the return value?

What are the definitions and calling rules of c language functions and what are the What are the definitions and calling rules of c language functions and what are the Mar 03, 2025 pm 05:53 PM

What are the definitions and calling rules of c language functions and what are the

Gulc: C library built from scratch Gulc: C library built from scratch Mar 03, 2025 pm 05:46 PM

Gulc: C library built from scratch

C language function format letter case conversion steps C language function format letter case conversion steps Mar 03, 2025 pm 05:53 PM

C language function format letter case conversion steps

Where is the return value of the c language function stored in memory? Where is the return value of the c language function stored in memory? Mar 03, 2025 pm 05:51 PM

Where is the return value of the c language function stored in memory?

distinct usage and phrase sharing distinct usage and phrase sharing Mar 03, 2025 pm 05:51 PM

distinct usage and phrase sharing

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently? How do I use algorithms from the STL (sort, find, transform, etc.) efficiently? Mar 12, 2025 pm 04:52 PM

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently?

How does the C   Standard Template Library (STL) work? How does the C Standard Template Library (STL) work? Mar 12, 2025 pm 04:50 PM

How does the C Standard Template Library (STL) work?

See all articles