title: Why the UPROPERTY specifiers Visible*/Edit* are used together with BlueprintRead*
body: <p>Unreal Engine 4 provides three specifiers to control the visibility and editability of an C++ class member exposed to Blueprint via <code>UPROPERTY()</code>.</p>
  
  <p>The documentation in the <a href="https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Runtime/CoreUObject/Public/UObject/ObjectMacros.h" rel="noreferrer">UE4 source code</a> (see also <a href="https://wiki.unrealengine.com/UPROPERTY" rel="noreferrer">UE4 wiki</a>, <a href="https://docs.unrealengine.com/en-us/Programming/UnrealArchitecture/Reference/Properties/Specifiers" rel="noreferrer">UE4 documentation</a>) says the following regarding editability:</p>
  
  <ul>
  <li>For <code>VisibleAnywhere</code>, <code>VisibleInstanceOnly</code>, <code>VisibleDefaultsOnly</code>:
  
  <blockquote>
    <p>... cannot be edited at all.</p>
  </blockquote></li>
  <li>For <code>EditAnywhere</code>, <code>EditInstanceOnly</code>, <code>EditDefaultsOnly</code>:
  
  <blockquote>
    <p>... can be edited ...</p>
  </blockquote></li>
  <li><p>For <code>BlueprintReadOnly</code>:</p>
  
  <blockquote>
    <p>... can be read by blueprints, but not modified.</p>
  </blockquote>
  
  <p>and <code>BlueprintReadWrite</code>:</p>
  
  <blockquote>
    <p>... can be read or written from a blueprint.</p>
  </blockquote></li>
  </ul>
  
  <p>Questions:</p>
  
  <ol>
  <li><p>Since the <code>Visible*</code> specifiers already restrict the usage to <strong>read only</strong> in Blueprints, why it is used in conjunction with <code>BlueprintReadOnly</code>? Isn't the second specifier <em>superfluous</em>? Example:</p>
  
  <pre><code>UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
  UMyActorComponent* MyActorComponent;
  </code></pre></li>
  <li><p>Even more confusing is the usage of <code>Edit*</code> specifiers, which allow <strong>read and write</strong> in Blueprint, together with <code>BlueprintReadOnly</code> which restricts to read only in Blueprint. Aren't both specifiers <em>opposing</em> each other? Example:</p>
  
  <pre><code>UPROPERTY(EditAnywhere, BlueprintReadOnly)
  UMyActorComponent* MyActorComponent;
  </code></pre></li>
  <li>Are the <code>Visible*</code>/<code>Edit*</code> specifiers valid in a different context than the <code>BlueprintRead*</code> specifiers? (the question is not about <code>InstanceOnly</code> (property windows for instances), <code>DefaultsOnly</code> (property windows for archetypes) and <code>Anywhere</code> (instances &amp; archetypes))</li>
  </ol>